From ce326dd0b3e2970436f69ee4cc70741ee68bce0d Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Sun, 31 Aug 2025 16:12:30 +0200 Subject: [PATCH] developer options --- firka/lib/helpers/settings/setting.dart | 33 +++-- firka/lib/l10n | 2 +- firka/lib/main.dart | 5 + firka/lib/ui/phone/pages/extras/extras.dart | 121 +++++++++++++----- .../ui/phone/screens/home/home_screen.dart | 8 ++ firka/lib/ui/phone/widgets/lesson.dart | 6 +- firka/pubspec.yaml | 1 + 7 files changed, 135 insertions(+), 41 deletions(-) diff --git a/firka/lib/helpers/settings/setting.dart b/firka/lib/helpers/settings/setting.dart index 488382a..e200dc2 100644 --- a/firka/lib/helpers/settings/setting.dart +++ b/firka/lib/helpers/settings/setting.dart @@ -32,6 +32,7 @@ const ttToastTestsAndHw = 1013; const ttToastBreaks = 1014; const statsForNerds = 1015; +const developerOptsEnabled = 1016; bool always() { return true; @@ -41,6 +42,11 @@ bool never() { return false; } +bool isDeveloper() { + return isDebug() || + initData.settings.group("settings").boolean("developer_enabled"); +} + bool isAndroid() { return Platform.isAndroid; } @@ -228,13 +234,6 @@ class SettingsStore { isAndroid), }), always), - "stats_for_nerds": SettingsBoolean( - statsForNerds, - FirkaIconType.majesticonsLocal, - "wrenchSolid", - l10n.s_stats_for_nerds, - false, - always), "notifications": SettingsSubGroup(0, FirkaIconType.majesticons, Majesticon.bellSolid, "Értesítések", LinkedHashMap.of({}), never), "extras": SettingsSubGroup( @@ -247,6 +246,22 @@ class SettingsStore { "settings_other_padding": SettingsPadding(0, 20, never), "settings_other_header": SettingsHeaderSmall(0, "Egyéb", never), + "developer": SettingsSubGroup( + 0, + FirkaIconType.majesticonsLocal, + "wrenchSolid", + l10n.s_developer, + LinkedHashMap.of({ + "stats_for_nerds": SettingsBoolean( + statsForNerds, + FirkaIconType.majesticonsLocal, + "wrenchSolid", + l10n.s_stats_for_nerds, + false, + always), + }), + isDeveloper), + // misc "beta_warning": SettingsBoolean( betaWarning, null, null, "Beta warning", false, never), @@ -281,7 +296,9 @@ class SettingsStore { true, always), }), - never) + never), + "developer_enabled": SettingsBoolean( + developerOptsEnabled, null, null, "Developer", false, never), }), always); diff --git a/firka/lib/l10n b/firka/lib/l10n index 4557640..1e557de 160000 --- a/firka/lib/l10n +++ b/firka/lib/l10n @@ -1 +1 @@ -Subproject commit 45576403397d46c575e0aaff88ecf0d510b069ab +Subproject commit 1e557de406de390f443e804caea8202f3d7e435f diff --git a/firka/lib/main.dart b/firka/lib/main.dart index 1386f35..d0fd7fd 100644 --- a/firka/lib/main.dart +++ b/firka/lib/main.dart @@ -23,6 +23,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:isar/isar.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:watch_connectivity/watch_connectivity.dart'; @@ -38,6 +39,7 @@ final GlobalKey navigatorKey = GlobalKey(); late AppInitialization initData; final dio = Dio(); +final isBeta = true; class DeviceInfo { String model; @@ -56,6 +58,7 @@ class DeviceInfo { class AppInitialization { final Isar isar; + final PackageInfo packageInfo; final DeviceInfo devInfo; late KretaClient client; int tokenCount; @@ -68,6 +71,7 @@ class AppInitialization { AppInitialization({ required this.isar, required this.devInfo, + required this.packageInfo, required this.tokenCount, required this.settings, required this.l10n, @@ -156,6 +160,7 @@ Future initializeApp() async { var init = AppInitialization( isar: isar, devInfo: devInfo, + packageInfo: await PackageInfo.fromPlatform(), tokenCount: tokenCount, settings: SettingsStore(AppLocalizationsHu()), l10n: AppLocalizationsHu(), diff --git a/firka/lib/ui/phone/pages/extras/extras.dart b/firka/lib/ui/phone/pages/extras/extras.dart index 23fc1a5..80661ef 100644 --- a/firka/lib/ui/phone/pages/extras/extras.dart +++ b/firka/lib/ui/phone/pages/extras/extras.dart @@ -1,3 +1,5 @@ +import 'package:firka/helpers/db/models/app_settings_model.dart'; +import 'package:firka/helpers/settings/setting.dart'; import 'package:firka/helpers/ui/firka_card.dart'; import 'package:firka/main.dart'; import 'package:firka/ui/model/style.dart'; @@ -6,8 +8,32 @@ import 'package:flutter/material.dart'; import '../../../../helpers/firka_bundle.dart'; import '../../screens/debug/debug_screen.dart'; +import '../../screens/home/home_screen.dart'; void showExtrasBottomSheet(BuildContext context, AppInitialization data) { + Widget debugBtn = SizedBox(); + + debugPrint("Developer mode: ${isDeveloper()}"); + + if (isDeveloper()) { + debugBtn = GestureDetector( + onTap: () => { + Navigator.pop(context), + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DefaultAssetBundle( + bundle: FirkaBundle(), child: DebugScreen(data)))) + }, + child: FirkaCard( + left: [Text(data.l10n.debug_screen)], + right: [], + ), + ); + } + + var debugCounter = 0; + showModalBottomSheet( context: context, elevation: 100, @@ -37,39 +63,74 @@ void showExtrasBottomSheet(BuildContext context, AppInitialization data) { ), child: Padding( padding: const EdgeInsets.all(16.0), - child: Column( + child: Stack( children: [ - GestureDetector( - onTap: () => { - Navigator.pop(context), - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DefaultAssetBundle( - bundle: FirkaBundle(), - child: DebugScreen(data)))) - }, - child: FirkaCard( - left: [Text(data.l10n.debug_screen)], - right: [], + Column( + children: [ + debugBtn, + GestureDetector( + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DefaultAssetBundle( + bundle: FirkaBundle(), + child: SettingsScreen( + data, data.settings.items)))); + }, + child: FirkaCard( + left: [Text(data.l10n.settings_screen)], + right: [], + ), + ) + ], + ), + Padding( + padding: const EdgeInsets.only(bottom: 32), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + GestureDetector( + child: Text( + "v${data.packageInfo.version} ${isBeta ? "beta" : ""}"), + onTap: () async { + if (isDebug()) return; + if (debugCounter == 10) { + data.settings.group("settings").setBoolean( + "developer_enabled", + !data.settings + .group("settings") + .boolean("developer_enabled")); + + await data.isar.writeTxn(() async { + await data.settings + .group("settings")["developer_enabled"]! + .save(data.isar.appSettingsModels); + }); + + Navigator.of(navigatorKey.currentContext!) + .popUntil((route) => false); + Navigator.push( + navigatorKey.currentContext!, + MaterialPageRoute( + builder: (context) => DefaultAssetBundle( + bundle: FirkaBundle(), + child: HomeScreen( + data, + false, + key: ValueKey('homeScreen'), + ))), + ); + } else if (debugCounter < 10) { + debugCounter++; + } + }, + ), + ], ), ), - GestureDetector( - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DefaultAssetBundle( - bundle: FirkaBundle(), - child: SettingsScreen( - data, data.settings.items)))); - }, - child: FirkaCard( - left: [Text(data.l10n.settings_screen)], - right: [], - ), - ) ], ), ), diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index fa0651e..b8f08b4 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -261,10 +261,16 @@ class _HomeScreenState extends State { _updateSystemUI(); }); + widget.data.settingsUpdateNotifier.addListener(settingsUpdateListener); + prefetch(); _preloadImages(); } + void settingsUpdateListener() { + setState(() {}); + } + Future _preloadImages() async { final imagePaths = widget.data.settings.appIcons.keys .map((icon) => "assets/images/icons/$icon.webp") @@ -553,6 +559,8 @@ class _HomeScreenState extends State { void dispose() { super.dispose(); + widget.data.settingsUpdateNotifier.removeListener(settingsUpdateListener); + _disposed = true; _fetching = false; _prefetched = false; diff --git a/firka/lib/ui/phone/widgets/lesson.dart b/firka/lib/ui/phone/widgets/lesson.dart index 8f87e38..5cc1f23 100644 --- a/firka/lib/ui/phone/widgets/lesson.dart +++ b/firka/lib/ui/phone/widgets/lesson.dart @@ -184,8 +184,10 @@ void showLessonBottomSheet( Color accent, Color secondary, Color bgColor) { - final statsForNerdsEnabled = - data.settings.group("settings").boolean("stats_for_nerds"); + final statsForNerdsEnabled = data.settings + .group("settings") + .subGroup("developer") + .boolean("stats_for_nerds"); showModalBottomSheet( context: context, elevation: 100, diff --git a/firka/pubspec.yaml b/firka/pubspec.yaml index eaf3116..0b25a4b 100644 --- a/firka/pubspec.yaml +++ b/firka/pubspec.yaml @@ -64,6 +64,7 @@ dependencies: transparent_pointer: ^1.0.1 flutter_staggered_grid_view: ^0.7.0 pull_to_refresh_flutter3: ^2.0.2 + package_info_plus: ^8.3.1 dev_dependencies: flutter_test: