Skip to content
This repository was archived by the owner on Apr 3, 2025. It is now read-only.

Commit b3caf34

Browse files
committed
feat(settings): ability to check for updates
1 parent 8b559e0 commit b3caf34

File tree

27 files changed

+301
-119
lines changed

27 files changed

+301
-119
lines changed

.env

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
FLAVOR=edge
22
COMMIT=master
3+
BUILD=9999999999

assets/localization/en.json

+7
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"lunasea.BuyMeASoda": "Buy Me A Soda",
3434
"lunasea.Cancel": "Cancel",
3535
"lunasea.Candidate": "Candidate",
36+
"lunasea.Changelog": "Changelog",
3637
"lunasea.ChangeProfiles": "Change Profiles",
3738
"lunasea.CheckLogsMessage": "Check the logs for more details",
3839
"lunasea.Clear": "Clear",
@@ -313,9 +314,11 @@
313314
"settings.BroadcastAddressHint2": "Typically this is the IP address of your machine with the last octet set to 255",
314315
"settings.BroadcastAddressHint3": "Given an example machine IP address of 192.168.1.111, the resulting broadcast IP address is 192.168.1.255",
315316
"settings.BroadcastAddressValidation": "Invalid Broadcast Address",
317+
"settings.Build": "Build",
316318
"settings.BuildChannels": "Build Channels",
317319
"settings.BuildChannelsDescription": "Learn About Additional Build Channels",
318320
"settings.CalendarSettings": "Calendar Settings",
321+
"settings.Channel": "Channel",
319322
"settings.ClearConfiguration": "Clear Configuration",
320323
"settings.ClearConfigurationHint1": "Are you sure you want to clear your configuration?",
321324
"settings.ClearConfigurationHint2": "You will be starting from a clean slate, please ensure you backup your current configuration first!",
@@ -378,6 +381,7 @@
378381
"settings.DocumentationDescription": "View the Documentation",
379382
"settings.Donations": "Donations",
380383
"settings.DonationsDescription": "Donate to the Developer",
384+
"settings.DownloadUpdate": "Download Update",
381385
"settings.Drawer": "Drawer",
382386
"settings.DrawerDescription": "Customize the Drawer",
383387
"settings.EditModule": "Edit Module",
@@ -450,6 +454,7 @@
450454
"settings.PasswordValidation": "Password Required",
451455
"settings.PastDays": "Past Days",
452456
"settings.PastDaysInScheduleView": "Past Days In Schedule View",
457+
"settings.Platform": "Platform",
453458
"settings.PleaseSignInAgain": "Please sign in again",
454459
"settings.Profiles": "Profiles",
455460
"settings.ProfilesBannerLine1": "Profiles allow you to add multiple instances of modules into LunaSea. You can switch between profiles in the main navigation drawer.",
@@ -502,10 +507,12 @@
502507
"settings.TLSCertificateValidationDescription": "Validate Certificates in TLS Connections",
503508
"settings.UpdateEmail": "Update Email",
504509
"settings.UpdatePassword": "Update Password",
510+
"settings.UpToDate": "Up To Date",
505511
"settings.Use24HourTime": "Use 24 Hour Time",
506512
"settings.Use24HourTimeDescription": "Show Timestamps in 24 Hour Style",
507513
"settings.Username": "Username",
508514
"settings.UsernameValidation": "Username Required",
515+
"settings.Version": "Version",
509516
"settings.ViewRecentChanges": "View Recent Changes",
510517
"settings.WeblateDescription": "Help Localize LunaSea",
511518
"settings.Website": "Website",

lib/core/cache/image_cache/platform/image_cache_io.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import 'package:lunasea/system/platform.dart';
66
import '../image_cache.dart';
77

88
bool isPlatformSupported() {
9-
final platform = LunaPlatform();
10-
return platform.isMobile || platform.isMacOS;
9+
return LunaPlatform.isMobile || LunaPlatform.isMacOS;
1110
}
1211

1312
LunaImageCache getImageCache() {

lib/core/database/database.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ class Database {
1313
static late _BoxManager<ProfileHiveObject> profiles;
1414

1515
String get _databasePath {
16-
final platform = LunaPlatform();
17-
if (platform.isWindows || platform.isLinux)
16+
if (LunaPlatform.isWindows || LunaPlatform.isLinux)
1817
return _DATABASE_PATH;
1918
else
2019
return _DATABASE_LEGACY_PATH;

lib/core/models/logs/log_type.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:lunasea/core.dart';
3-
import 'package:lunasea/system/environment.dart';
43
import 'package:lunasea/system/flavor.dart';
54

65
part 'log_type.g.dart';
@@ -54,7 +53,7 @@ extension LunaLogTypeExtension on LunaLogType {
5453
case LunaLogType.CRITICAL:
5554
return true;
5655
case LunaLogType.DEBUG:
57-
return LunaEnvironment().isFlavorSupported(LunaFlavor.CANDIDATE);
56+
return LunaFlavor.CANDIDATE.isRunningFlavor();
5857
}
5958
}
6059

lib/core/modules.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import 'package:lunasea/modules/dashboard/core/state.dart' as dashboard_state;
2020
import 'package:lunasea/modules/dashboard/routes/dashboard/route.dart'
2121
as dashboard_home;
2222
import 'package:lunasea/modules/wake_on_lan/api/wake_on_lan.dart';
23-
import 'package:lunasea/system/environment.dart';
2423
import 'package:lunasea/system/flavor.dart';
2524

2625
part 'modules.g.dart';
@@ -79,7 +78,7 @@ extension LunaModuleExtension on LunaModule {
7978
case LunaModule.NZBGET:
8079
return true;
8180
case LunaModule.OVERSEERR:
82-
return LunaEnvironment().isFlavorSupported(LunaFlavor.EDGE);
81+
return LunaFlavor.EDGE.isRunningFlavor();
8382
case LunaModule.RADARR:
8483
return true;
8584
case LunaModule.SABNZBD:

lib/core/system/in_app_purchases.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class LunaInAppPurchases {
5353
static List<ProductDetails> donationIAPs = [];
5454
static bool isAvailable = false;
5555

56-
static bool get isSupported => LunaPlatform().isMobile;
56+
static bool get isSupported => LunaPlatform.isMobile;
5757

5858
/// Callback function for [purchaseStream].
5959
static Future<void> _purchasedCallback(

lib/core/utilities/changelog.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:lunasea/core.dart';
33
import 'package:lunasea/extensions/string.dart';
4-
import 'package:lunasea/system/environment.dart';
4+
import 'package:lunasea/system/build.dart';
55
import 'package:lunasea/system/flavor.dart';
66

77
class LunaChangelogSheet extends LunaBottomModalSheet {
@@ -28,8 +28,8 @@ class LunaChangelogSheet extends LunaBottomModalSheet {
2828
bool showCommitHistory = false,
2929
}) async {
3030
// Do not show unless it is a prod release
31-
if (LunaEnvironment().isFlavorSupported(LunaFlavor.CANDIDATE)) {
32-
if (showCommitHistory) LunaEnvironment().openCommitHistory();
31+
if (LunaFlavor.CANDIDATE.isRunningFlavor()) {
32+
if (showCommitHistory) LunaBuild().openCommitHistory();
3333
return;
3434
}
3535

lib/firebase/core.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import 'options.dart';
66

77
class LunaFirebase {
88
static bool get isSupported {
9-
final platform = LunaPlatform();
10-
if (platform.isMobile || platform.isMacOS || platform.isWeb) {
9+
if (LunaPlatform.isMobile || LunaPlatform.isMacOS || LunaPlatform.isWeb) {
1110
// Validate that the firebase config exists by trying to load it
1211
try {
1312
DefaultFirebaseOptions.currentPlatform;

lib/firebase/messaging.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ class LunaFirebaseMessaging {
88
'BGCP2BO8JOTuvagaYl41btXiiC_XszsGCDduq6C-escc4xb2UMglX3RDojCY1YuGMAx2lXGVF-VYmTN3LQGvhYc';
99

1010
static bool get isSupported {
11-
final platform = LunaPlatform();
12-
if (LunaFirebase.isSupported && !platform.isWeb) return true;
11+
if (LunaFirebase.isSupported && !LunaPlatform.isWeb) return true;
1312
return false;
1413
}
1514

lib/main.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class LunaBIOS extends StatelessWidget {
5353

5454
return ProviderScope(
5555
child: DevicePreview(
56-
enabled: kDebugMode && LunaPlatform().isDesktop,
56+
enabled: kDebugMode && LunaPlatform.isDesktop,
5757
builder: (context) => EasyLocalization(
5858
supportedLocales: LunaLocalization().supportedLocales(),
5959
path: LunaLocalization.fileDirectory,

lib/modules/settings/routes/settings/route.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:lunasea/core.dart';
33
import 'package:lunasea/firebase/core.dart';
44
import 'package:lunasea/firebase/messaging.dart';
55
import 'package:lunasea/modules/settings.dart';
6-
import 'package:lunasea/system/environment.dart';
76
import 'package:lunasea/system/flavor.dart';
87

98
class SettingsHomeRouter extends SettingsPageRouter {
@@ -96,7 +95,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
9695
trailing: const LunaIconButton(icon: Icons.settings_rounded),
9796
onTap: () async => SettingsSystemRouter().navigateTo(context),
9897
),
99-
if (LunaEnvironment().isFlavorSupported(LunaFlavor.EDGE))
98+
if (LunaFlavor.CANDIDATE.isRunningFlavor())
10099
LunaBlock(
101100
title: 'settings.DebugMenu'.tr(),
102101
body: [TextSpan(text: 'settings.DebugMenuDescription'.tr())],

lib/modules/settings/routes/system/route.dart

+6-36
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import 'package:lunasea/firebase/auth.dart';
44
import 'package:lunasea/firebase/core.dart';
55
import 'package:lunasea/modules/settings.dart';
66
import 'package:lunasea/core/cache/image_cache/image_cache.dart';
7-
import 'package:lunasea/system/environment.dart';
8-
import 'package:lunasea/system/flavor.dart';
7+
import 'package:lunasea/modules/settings/routes/system/widgets/build_details.dart';
8+
import 'package:lunasea/system/build.dart';
99

1010
class SettingsSystemRouter extends SettingsPageRouter {
1111
SettingsSystemRouter() : super('/settings/system');
@@ -25,6 +25,8 @@ class _Widget extends StatefulWidget {
2525

2626
class _State extends State<_Widget> with LunaScrollControllerMixin {
2727
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
28+
final packageInfo = PackageInfo.fromPlatform();
29+
final checkForUpdates = LunaBuild().checkForUpdates();
2830

2931
@override
3032
Widget build(BuildContext context) {
@@ -46,50 +48,18 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
4648
return LunaListView(
4749
controller: scrollController,
4850
children: <Widget>[
49-
_versionInformation(),
50-
_logs(),
51+
const BuildDetails(),
5152
LunaDivider(),
5253
const SettingsSystemBackupRestoreBackupTile(),
5354
const SettingsSystemBackupRestoreRestoreTile(),
5455
LunaDivider(),
56+
_logs(),
5557
if (LunaImageCache.isSupported) _clearImageCache(),
5658
_clearConfiguration(),
5759
],
5860
);
5961
}
6062

61-
Widget _versionInformation() {
62-
LunaEnvironment _env = LunaEnvironment();
63-
LunaFlavor _flavor = LunaFlavor.EDGE.from(LunaEnvironment.flavor);
64-
65-
return FutureBuilder(
66-
future: PackageInfo.fromPlatform(),
67-
builder: (context, AsyncSnapshot<PackageInfo> snapshot) {
68-
String version = 'Loading${LunaUI.TEXT_ELLIPSIS}';
69-
if (snapshot.hasError) version = 'Unknown';
70-
if (snapshot.hasData) version = snapshot.data!.version;
71-
return LunaBlock(
72-
title: 'Version: $version',
73-
body: [
74-
TextSpan(
75-
text: _env.isFlavorSupported(LunaFlavor.CANDIDATE)
76-
? '${_flavor.name} (${_env.getShortCommit()})'
77-
: 'settings.ViewRecentChanges'.tr(),
78-
style: TextStyle(
79-
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
80-
color: _flavor.color,
81-
),
82-
),
83-
],
84-
trailing: const LunaIconButton(icon: Icons.system_update_rounded),
85-
onTap: () async => LunaChangelogSheet().show(
86-
context: context,
87-
showCommitHistory: true,
88-
),
89-
);
90-
});
91-
}
92-
9363
Widget _logs() {
9464
return LunaBlock(
9565
title: 'Logs',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:lunasea/core/utilities/changelog.dart';
3+
import 'package:lunasea/extensions/string_links.dart';
4+
import 'package:lunasea/system/build.dart';
5+
import 'package:lunasea/system/environment.dart';
6+
import 'package:lunasea/system/flavor.dart';
7+
import 'package:lunasea/system/platform.dart';
8+
import 'package:lunasea/vendor.dart';
9+
import 'package:lunasea/widgets/ui.dart';
10+
11+
class BuildDetails extends ConsumerStatefulWidget {
12+
const BuildDetails({Key? key}) : super(key: key);
13+
14+
@override
15+
ConsumerState<BuildDetails> createState() => _State();
16+
}
17+
18+
class _State extends ConsumerState<BuildDetails> {
19+
Future<PackageInfo> packageInfo = PackageInfo.fromPlatform();
20+
Future<bool> checkForUpdates = LunaBuild().checkForUpdates();
21+
22+
@override
23+
Widget build(BuildContext context) {
24+
return FutureBuilder(
25+
future: packageInfo,
26+
builder: (context, AsyncSnapshot<PackageInfo> package) {
27+
return FutureBuilder(
28+
future: checkForUpdates,
29+
builder: (context, AsyncSnapshot<bool> updates) {
30+
return LunaTableCard(
31+
content: [
32+
LunaTableContent(
33+
title: 'settings.Version'.tr(),
34+
body: package.data?.version ?? 'lunasea.Unknown'.tr(),
35+
),
36+
LunaTableContent(
37+
title: 'settings.Platform'.tr(),
38+
body: LunaPlatform.current.name,
39+
),
40+
LunaTableContent(
41+
title: 'settings.Channel'.tr(),
42+
body: LunaFlavor.current.name,
43+
),
44+
LunaTableContent(
45+
title: 'settings.Build'.tr(),
46+
body: '${LunaEnvironment.build} (${LunaBuild().shortCommit})',
47+
),
48+
],
49+
buttons: [
50+
_changesButton(context),
51+
_updatesButton(updates),
52+
],
53+
);
54+
},
55+
);
56+
},
57+
);
58+
}
59+
60+
LunaButton _changesButton(BuildContext context) {
61+
return LunaButton.text(
62+
icon: LunaIcons.CHANGELOG,
63+
text: 'lunasea.Changelog'.tr(),
64+
onTap: () async => LunaChangelogSheet().show(
65+
context: context,
66+
showCommitHistory: true,
67+
),
68+
);
69+
}
70+
71+
LunaButton _updatesButton(AsyncSnapshot<bool> updates) {
72+
if (updates.hasError) {
73+
return LunaButton.text(
74+
icon: LunaIcons.ERROR,
75+
text: 'Error',
76+
);
77+
}
78+
if (updates.connectionState == ConnectionState.done && updates.hasData) {
79+
if (updates.data!) {
80+
return LunaButton.text(
81+
icon: LunaIcons.DOWNLOAD,
82+
color: LunaColours.orange,
83+
text: 'settings.DownloadUpdate'.tr(),
84+
onTap: LunaFlavor.current.downloadLink.openLink,
85+
);
86+
} else {
87+
return LunaButton.text(
88+
icon: LunaIcons.CHECK_MARK,
89+
color: LunaColours.accent,
90+
text: 'settings.UpToDate'.tr(),
91+
onTap: () => setState(() {
92+
checkForUpdates = LunaBuild().checkForUpdates();
93+
}),
94+
);
95+
}
96+
}
97+
98+
return LunaButton.loader();
99+
}
100+
}

0 commit comments

Comments
 (0)