1
0
forked from firka/firka

developer options

This commit is contained in:
2025-08-31 16:12:30 +02:00
parent f2614b2cf7
commit ce326dd0b3
7 changed files with 135 additions and 41 deletions

View File

@@ -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);

View File

@@ -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<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
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<AppInitialization> initializeApp() async {
var init = AppInitialization(
isar: isar,
devInfo: devInfo,
packageInfo: await PackageInfo.fromPlatform(),
tokenCount: tokenCount,
settings: SettingsStore(AppLocalizationsHu()),
l10n: AppLocalizationsHu(),

View File

@@ -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: [],
),
)
],
),
),

View File

@@ -261,10 +261,16 @@ class _HomeScreenState extends State<HomeScreen> {
_updateSystemUI();
});
widget.data.settingsUpdateNotifier.addListener(settingsUpdateListener);
prefetch();
_preloadImages();
}
void settingsUpdateListener() {
setState(() {});
}
Future<void> _preloadImages() async {
final imagePaths = widget.data.settings.appIcons.keys
.map((icon) => "assets/images/icons/$icon.webp")
@@ -553,6 +559,8 @@ class _HomeScreenState extends State<HomeScreen> {
void dispose() {
super.dispose();
widget.data.settingsUpdateNotifier.removeListener(settingsUpdateListener);
_disposed = true;
_fetching = false;
_prefetched = false;

View File

@@ -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,

View File

@@ -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: