import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:prasule/api/wallet_manager.dart'; import 'package:prasule/main.dart'; import 'package:prasule/pw/platformbutton.dart'; import 'package:prasule/pw/platformroute.dart'; import 'package:prasule/util/show_message.dart'; import 'package:prasule/views/settings/edit_categories.dart'; import 'package:prasule/views/settings/graph_type.dart'; import 'package:prasule/views/settings/tessdata_list.dart'; import 'package:settings_ui/settings_ui.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// Shows settings categories class SettingsView extends StatefulWidget { /// Shows settings categories const SettingsView({super.key}); @override State createState() => _SettingsViewState(); } class _SettingsViewState extends State { var _useMaterialYou = true; final _supportsYou = MyApp.appliedYou; @override void initState() { super.initState(); SharedPreferences.getInstance().then((s) { _useMaterialYou = s.getBool("useMaterialYou") ?? true; setState(() {}); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(AppLocalizations.of(context).settings)), body: SettingsList( applicationType: ApplicationType.both, darkTheme: SettingsThemeData( settingsListBackground: Theme.of(context).colorScheme.background, titleTextColor: Theme.of(context).colorScheme.primary, ), sections: [ SettingsSection( title: Text(AppLocalizations.of(context).wallet), tiles: [ SettingsTile.navigation( title: Text(AppLocalizations.of(context).editCategories), description: Text(AppLocalizations.of(context).editCategoriesDesc), trailing: const Icon(Icons.keyboard_arrow_right), onPressed: (context) => Navigator.of(context).push( platformRoute( (c) => const EditCategoriesView(), ), ), ), ], ), SettingsSection( tiles: [ SettingsTile.navigation( title: Text(AppLocalizations.of(context).downloadedOcr), description: Text(AppLocalizations.of(context).downloadedOcrDesc), trailing: const Icon(Icons.keyboard_arrow_right), onPressed: (context) => Navigator.of(context).push( platformRoute( (c) => const TessdataListView(), ), ), ), ], title: Text(AppLocalizations.of(context).ocr), ), SettingsSection( title: Text(AppLocalizations.of(context).settingsAppearance), tiles: [ SettingsTile.navigation( title: Text(AppLocalizations.of(context).graphType), description: Text(AppLocalizations.of(context).graphTypeDesc), trailing: const Icon(Icons.keyboard_arrow_right), onPressed: (c) => Navigator.of(c).push( platformRoute( (p0) => const GraphTypeSettingsView(), ), ), ), if (Platform.isAndroid && _supportsYou) SettingsTile.switchTile( initialValue: _useMaterialYou, onToggle: (v) async { final s = await SharedPreferences.getInstance(); await s.setBool("useMaterialYou", v); _useMaterialYou = v; setState(() {}); }, title: Text(AppLocalizations.of(context).enableYou), description: Text( AppLocalizations.of(context).enableYouDesc, ), ), ], ), if (!Platform.isIOS) SettingsSection( //! TODO: Find a replacement for iOS title: Text(AppLocalizations.of(context).settingsData), tiles: [ SettingsTile.navigation( title: Text(AppLocalizations.of(context).exportSingle), description: Text(AppLocalizations.of(context).exportSingleDesc), onPressed: (ctx) async { final all = await WalletManager.listWallets(); if (!ctx.mounted) return; final w = await showAdaptiveDialog( context: ctx, builder: (ctx) => AlertDialog.adaptive( title: Text( AppLocalizations.of(context).selectExportWallet, ), actions: [ PlatformButton( text: AppLocalizations.of(context).cancel, onPressed: () => Navigator.of(ctx).pop(), ), ], content: SizedBox( width: MediaQuery.of(context).size.width * 0.7, height: MediaQuery.of(context).size.height * 0.3, child: ListView.builder( itemBuilder: (con, i) => InkWell( onTap: () => Navigator.of(ctx).pop(all[i].name), child: Padding( padding: const EdgeInsets.all(8), child: Text( all[i].name, textAlign: TextAlign.center, ), ), ), shrinkWrap: true, itemCount: all.length, ), ), ), ); if (w == null) return; try { await WalletManager.exportWallet(name: w); } catch (e) { if (!context.mounted) return; unawaited( showAdaptiveDialog( context: context, builder: (ctx) => AlertDialog.adaptive( title: Text( AppLocalizations.of(context).exportError, ), content: SingleChildScrollView( child: Flexible( child: Text(e.toString()), ), ), ), ), ); logger.e(e); return; } if (!ctx.mounted) return; unawaited( showMessage( AppLocalizations.of(ctx).exportCompleted, ctx, ), ); }, ), SettingsTile.navigation( title: Text(AppLocalizations.of(context).exportArchive), description: Text(AppLocalizations.of(context).exportArchiveDesc), onPressed: (ctx) async { try { await WalletManager.exportAllWallets(); } catch (e) { if (!ctx.mounted) return; unawaited( showAdaptiveDialog( context: context, builder: (ctx) => AlertDialog.adaptive( title: Text( AppLocalizations.of(context).exportError, ), content: SingleChildScrollView( child: Flexible( child: Text(e.toString()), ), ), ), ), ); logger.e(e); return; } if (!ctx.mounted) return; unawaited( showMessage( AppLocalizations.of(ctx).exportCompleted, context, ), ); }, ), SettingsTile.navigation( title: Text(AppLocalizations.of(context).importSingle), description: Text(AppLocalizations.of(context).importSingleDesc), onPressed: (ctx) async { try { await WalletManager.importWallet(); } catch (e) { if (!ctx.mounted) return; unawaited( showAdaptiveDialog( context: context, builder: (ctx) => AlertDialog.adaptive( title: Text( AppLocalizations.of(context).exportError, ), content: SingleChildScrollView( child: Flexible( child: Text(e.toString()), ), ), ), ), ); logger.e(e); return; } if (!ctx.mounted) return; unawaited( showMessage( AppLocalizations.of(ctx).importCompleted, context, ), ); }, ), SettingsTile.navigation( title: Text(AppLocalizations.of(context).importArchive), description: Text(AppLocalizations.of(context).importArchiveDesc), onPressed: (ctx) async { try { await WalletManager.importArchive(); } catch (e) { if (!ctx.mounted) return; unawaited( showAdaptiveDialog( context: context, builder: (ctx) => AlertDialog.adaptive( title: Text( AppLocalizations.of(context).exportError, ), content: SingleChildScrollView( child: Flexible( child: Text(e.toString()), ), ), ), ), ); logger.e(e); return; } if (!ctx.mounted) return; unawaited( showMessage( AppLocalizations.of(ctx).importCompleted, context, ), ); }, ), ], ), ], ), ); } }