@@ -2,9 +2,9 @@ import 'dart:async';
22
33import 'package:flutter/foundation.dart' ;
44import 'package:flutter/material.dart' ;
5- import 'package:flutter/services.dart' ;
65import 'package:flutter_localizations/flutter_localizations.dart' ;
76import 'package:flutter_riverpod/flutter_riverpod.dart' ;
7+ import 'package:forui/forui.dart' ;
88import 'package:open_authenticator/app.dart' ; // TODO
99import 'package:open_authenticator/i18n/translations.g.dart' ;
1010import 'package:open_authenticator/model/app_links.dart' ;
@@ -19,11 +19,13 @@ import 'package:open_authenticator/pages/intro/page.dart';
1919import 'package:open_authenticator/pages/scan.dart' ;
2020import 'package:open_authenticator/pages/settings/page.dart' ;
2121import 'package:open_authenticator/pages/totp.dart' ;
22+ import 'package:open_authenticator/themes.dart' ;
23+ import 'package:open_authenticator/utils/brightness_listener.dart' ;
2224import 'package:open_authenticator/utils/platform.dart' ;
2325import 'package:open_authenticator/utils/rate_my_app.dart' ;
2426import 'package:open_authenticator/utils/utils.dart' ;
2527import 'package:open_authenticator/widgets/centered_circular_progress_indicator.dart' ;
26- import 'package:open_authenticator/widgets/dialog/totp_limit .dart' ;
28+ import 'package:open_authenticator/widgets/dialog/totp_limit_dialog .dart' ;
2729import 'package:open_authenticator/widgets/unlock_challenge.dart' ;
2830import 'package:open_authenticator/widgets/waiting_overlay.dart' ;
2931import 'package:rate_my_app/rate_my_app.dart' ;
@@ -43,6 +45,7 @@ Future<void> main() async {
4345 size: Size (800 , 600 ),
4446 minimumSize: Size (400 , 400 ),
4547 center: true ,
48+ titleBarStyle: TitleBarStyle .hidden,
4649 ),
4750 () async {
4851 await windowManager.show ();
@@ -125,110 +128,82 @@ class OpenAuthenticatorApp extends ConsumerWidget {
125128 required Locale locale,
126129 String ? initialRoute,
127130 Widget ? home,
128- }) {
129- ColorScheme light = ColorScheme .fromSeed (
130- seedColor: Colors .green,
131- );
132- ColorScheme dark = ColorScheme .fromSeed (
133- seedColor: Colors .green,
134- brightness: Brightness .dark,
135- );
136- return MaterialApp (
137- key: ValueKey ('materialApp.$showIntroState ' ),
138- title: App .appName,
139- locale: locale,
140- localizationsDelegates: const [
141- GlobalMaterialLocalizations .delegate,
142- GlobalWidgetsLocalizations .delegate,
143- GlobalCupertinoLocalizations .delegate,
144- ],
145- supportedLocales: AppLocaleUtils .supportedLocales,
146- themeMode: theme.value,
147- darkTheme: ThemeData (
148- brightness: Brightness .dark,
149- appBarTheme: AppBarTheme (
150- systemOverlayStyle: SystemUiOverlayStyle (
151- statusBarIconBrightness: Brightness .light,
152- systemNavigationBarColor: dark.surface,
153- ),
154- shape: const RoundedRectangleBorder (),
155- surfaceTintColor: Colors .green,
156- ),
157- colorScheme: dark,
158- // iconButtonTheme: IconButtonThemeData(
159- // style: ButtonStyle(
160- // foregroundColor: MaterialStatePropertyAll(Colors.green.shade300),
161- // ),
162- // ),
163- buttonTheme: const ButtonThemeData (
164- alignedDropdown: true ,
165- ),
166- floatingActionButtonTheme: FloatingActionButtonThemeData (
167- shape: const CircleBorder (),
168- backgroundColor: Colors .green.shade700,
169- foregroundColor: Colors .green.shade50,
170- ),
171- ),
172- theme: ThemeData (
173- colorScheme: light,
174- appBarTheme: AppBarTheme (
175- systemOverlayStyle: SystemUiOverlayStyle (
176- statusBarIconBrightness: Brightness .dark,
177- systemNavigationBarColor: light.surface,
178- ),
179- shape: const RoundedRectangleBorder (),
180- ),
181- buttonTheme: const ButtonThemeData (
182- alignedDropdown: true ,
183- ),
184- floatingActionButtonTheme: FloatingActionButtonThemeData (
185- shape: const CircleBorder (),
186- backgroundColor: Colors .green.shade50,
187- foregroundColor: Colors .green.shade700,
188- ),
189- inputDecorationTheme: InputDecorationTheme (
190- disabledBorder: UnderlineInputBorder (
191- borderSide: BorderSide (color: Colors .grey.shade400),
192- ),
193- ),
194- dividerTheme: const DividerThemeData (
195- color: Colors .black12,
196- ),
197- ),
198- routes: home == null
199- ? {
200- IntroPage .name: (_) => const _RouteWidget (
201- child: IntroPage (),
202- ),
203- HomePage .name: (_) => const _RouteWidget (
204- listen: true ,
205- rateMyApp: true ,
206- child: HomePage (),
207- ),
208- ScanPage .name: (_) => const _RouteWidget (
209- child: ScanPage (),
210- ),
211- SettingsPage .name: (_) => const _RouteWidget (
212- child: SettingsPage (),
213- ),
214- TotpPage .name: (context) {
215- Map <String , dynamic >? arguments = ModalRoute .of (context)! .settings.arguments as Map <String , dynamic >? ;
216- return _RouteWidget (
217- child: TotpPage (
218- totp: arguments? [kRouteParameterTotp],
219- add: arguments? [kRouteParameterAddTotp],
220- ),
221- );
222- },
223- ContributorPlanPaywallPage .name: (_) => const _RouteWidget (
224- child: ContributorPlanPaywallPage (),
225- ),
226- }
227- : {},
228- initialRoute: home == null ? initialRoute : null ,
229- home: home,
230- );
231- }
131+ }) => MaterialApp (
132+ key: ValueKey ('materialApp.$showIntroState ' ),
133+ title: App .appName,
134+ locale: locale,
135+ localizationsDelegates: const [
136+ GlobalMaterialLocalizations .delegate,
137+ GlobalWidgetsLocalizations .delegate,
138+ GlobalCupertinoLocalizations .delegate,
139+ ],
140+ supportedLocales: AppLocaleUtils .supportedLocales,
141+ themeMode: theme.value,
142+ darkTheme: greenTheme.dark.toApproximateMaterialTheme (),
143+ theme: greenTheme.light.toApproximateMaterialTheme (),
144+ builder: (context, child) => _AnimatedTheme (
145+ light: greenTheme.light,
146+ dark: greenTheme.dark,
147+ child: FToaster (child: child! ),
148+ ),
149+ routes: home == null
150+ ? {
151+ IntroPage .name: (_) => const _RouteWidget (
152+ child: IntroPage (),
153+ ),
154+ HomePage .name: (_) => const _RouteWidget (
155+ listen: true ,
156+ rateMyApp: true ,
157+ child: HomePage (),
158+ ),
159+ ScanPage .name: (_) => const _RouteWidget (
160+ child: ScanPage (),
161+ ),
162+ SettingsPage .name: (_) => const _RouteWidget (
163+ child: SettingsPage (),
164+ ),
165+ TotpPage .name: (context) {
166+ Map <String , dynamic >? arguments = ModalRoute .of (context)! .settings.arguments as Map <String , dynamic >? ;
167+ return _RouteWidget (
168+ child: TotpPage (
169+ totp: arguments? [kRouteParameterTotp],
170+ add: arguments? [kRouteParameterAddTotp],
171+ ),
172+ );
173+ },
174+ ContributorPlanPaywallPage .name: (_) => const _RouteWidget (
175+ child: ContributorPlanPaywallPage (),
176+ ),
177+ }
178+ : {},
179+ initialRoute: home == null ? initialRoute : null ,
180+ home: home,
181+ );
182+ }
183+
184+ class _AnimatedTheme extends ConsumerStatefulWidget {
185+ final FThemeData light;
186+ final FThemeData dark;
187+ final Widget child;
188+
189+ const _AnimatedTheme ({
190+ required this .light,
191+ required this .dark,
192+ required this .child,
193+ });
194+
195+ @override
196+ ConsumerState <ConsumerStatefulWidget > createState () => _AnimatedThemeState ();
197+
198+ }
199+
200+ class _AnimatedThemeState extends ConsumerState <_AnimatedTheme > with BrightnessListener {
201+ @override
202+ Widget build (BuildContext context) => FAnimatedTheme (
203+ data: currentBrightness == Brightness .dark ? widget.dark : widget.light,
204+ child: widget.child,
205+ );
206+
232207}
233208
234209/// A route that allows to listen to dynamic links and [totpLimitExceededProvider] .
0 commit comments