From 0d888363ff35be0a5d5feb60a293b4b69e91b008 Mon Sep 17 00:00:00 2001 From: Christien Rioux Date: Mon, 17 Mar 2025 22:51:34 -0400 Subject: [PATCH] native device orientation work --- lib/app.dart | 182 ++++++++++--------- lib/layout/home/drawer_menu/drawer_menu.dart | 10 +- lib/layout/home/home_screen.dart | 67 ++++--- 3 files changed, 141 insertions(+), 118 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 72d845f..683a450 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -8,6 +8,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_translate/flutter_translate.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:native_device_orientation/native_device_orientation.dart'; import 'package:provider/provider.dart'; import 'package:veilid_support/veilid_support.dart'; @@ -100,6 +101,94 @@ class VeilidChatApp extends StatelessWidget { onInvoke: (intent) => _attachDetach(context)), }, child: Focus(autofocus: true, child: builder(context))))); + Widget appBuilder( + BuildContext context, LocalizationDelegate localizationDelegate) => + ThemeProvider( + initTheme: initialThemeData, + builder: (context, theme) => LocalizationProvider( + state: LocalizationProvider.of(context).state, + child: MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => + PreferencesCubit(PreferencesRepository.instance), + ), + BlocProvider( + create: (context) => NotificationsCubit( + const NotificationsState(queue: IList.empty()))), + BlocProvider( + create: (context) => + ConnectionStateCubit(ProcessorRepository.instance)), + BlocProvider( + create: (context) => RouterCubit(AccountRepository.instance), + ), + BlocProvider( + create: (context) => + LocalAccountsCubit(AccountRepository.instance), + ), + BlocProvider( + create: (context) => + UserLoginsCubit(AccountRepository.instance), + ), + BlocProvider( + create: (context) => + ActiveLocalAccountCubit(AccountRepository.instance), + ), + BlocProvider( + create: (context) => PerAccountCollectionBlocMapCubit( + accountRepository: AccountRepository.instance, + locator: context.read)), + ], + child: + BackgroundTicker(child: _buildShortcuts(builder: (context) { + final scale = theme.extension()!; + final scaleConfig = theme.extension()!; + + final gradient = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: scaleConfig.preferBorders && + theme.brightness == Brightness.light + ? [ + scale.grayScale.hoverElementBackground, + scale.grayScale.subtleBackground, + ] + : [ + scale.primaryScale.hoverElementBackground, + scale.primaryScale.subtleBackground, + ]); + + final wallpaper = PreferencesRepository + .instance.value.themePreference + .wallpaper(); + + return Stack( + fit: StackFit.expand, + alignment: Alignment.center, + children: [ + wallpaper ?? + DecoratedBox( + decoration: BoxDecoration(gradient: gradient)), + MaterialApp.router( + scrollBehavior: const ScrollBehaviorModified(), + debugShowCheckedModeBanner: false, + routerConfig: context.read().router(), + title: translate('app.title'), + theme: theme, + localizationsDelegates: [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FormBuilderLocalizations.delegate, + localizationDelegate + ], + supportedLocales: localizationDelegate.supportedLocales, + locale: localizationDelegate.currentLocale, + ) + ]); + })), + )), + ); + @override Widget build(BuildContext context) => FutureProvider( initialData: null, @@ -112,93 +201,14 @@ class VeilidChatApp extends StatelessWidget { } // Once init is done, we proceed with the app final localizationDelegate = LocalizedApp.of(context).delegate; - return ThemeProvider( - initTheme: initialThemeData, - builder: (context, theme) => LocalizationProvider( - state: LocalizationProvider.of(context).state, - child: MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => - PreferencesCubit(PreferencesRepository.instance), - ), - BlocProvider( - create: (context) => NotificationsCubit( - const NotificationsState(queue: IList.empty()))), - BlocProvider( - create: (context) => - ConnectionStateCubit(ProcessorRepository.instance)), - BlocProvider( - create: (context) => - RouterCubit(AccountRepository.instance), - ), - BlocProvider( - create: (context) => - LocalAccountsCubit(AccountRepository.instance), - ), - BlocProvider( - create: (context) => - UserLoginsCubit(AccountRepository.instance), - ), - BlocProvider( - create: (context) => - ActiveLocalAccountCubit(AccountRepository.instance), - ), - BlocProvider( - create: (context) => PerAccountCollectionBlocMapCubit( - accountRepository: AccountRepository.instance, - locator: context.read)), - ], - child: - BackgroundTicker(child: _buildShortcuts(builder: (context) { - final scale = theme.extension()!; - final scaleConfig = theme.extension()!; - final gradient = LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: scaleConfig.preferBorders && - theme.brightness == Brightness.light - ? [ - scale.grayScale.hoverElementBackground, - scale.grayScale.subtleBackground, - ] - : [ - scale.primaryScale.hoverElementBackground, - scale.primaryScale.subtleBackground, - ]); - - final wallpaper = PreferencesRepository - .instance.value.themePreference - .wallpaper(); - - return Stack( - fit: StackFit.expand, - alignment: Alignment.center, - children: [ - wallpaper ?? - DecoratedBox( - decoration: BoxDecoration(gradient: gradient)), - MaterialApp.router( - scrollBehavior: const ScrollBehaviorModified(), - debugShowCheckedModeBanner: false, - routerConfig: context.read().router(), - title: translate('app.title'), - theme: theme, - localizationsDelegates: [ - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - FormBuilderLocalizations.delegate, - localizationDelegate - ], - supportedLocales: - localizationDelegate.supportedLocales, - locale: localizationDelegate.currentLocale, - ) - ]); - })), - )), - ); + if (isiOS || isAndroid) { + return NativeDeviceOrientationReader( + //useSensor: false, + builder: (context) => appBuilder(context, localizationDelegate)); + } else { + return appBuilder(context, localizationDelegate); + } }); @override diff --git a/lib/layout/home/drawer_menu/drawer_menu.dart b/lib/layout/home/drawer_menu/drawer_menu.dart index f88a888..6aa817f 100644 --- a/lib/layout/home/drawer_menu/drawer_menu.dart +++ b/lib/layout/home/drawer_menu/drawer_menu.dart @@ -318,7 +318,7 @@ class _DrawerMenuState extends State { scale.subtleBorder, ]); - return DecoratedBox( + Widget menu = DecoratedBox( decoration: ShapeDecoration( shadows: themedShadow(scaleConfig, scale), gradient: scaleConfig.useVisualIndicators ? null : gradient, @@ -393,6 +393,12 @@ class _DrawerMenuState extends State { ), ]) ]).paddingAll(16), - ).paddingLTRB(0, 2, 2, 2); + ); + + if (scaleConfig.preferBorders || scaleConfig.useVisualIndicators) { + menu = menu.paddingLTRB(0, 2, 2, 2); + } + + return menu; } } diff --git a/lib/layout/home/home_screen.dart b/lib/layout/home/home_screen.dart index 0ec1f26..56f4c02 100644 --- a/lib/layout/home/home_screen.dart +++ b/lib/layout/home/home_screen.dart @@ -13,6 +13,7 @@ import 'package:veilid_support/veilid_support.dart'; import '../../account_manager/account_manager.dart'; import '../../settings/settings.dart'; import '../../theme/theme.dart'; +import '../../tools/native_safe_area.dart'; import 'drawer_menu/drawer_menu.dart'; import 'home_account_invalid.dart'; import 'home_account_locked.dart'; @@ -208,36 +209,42 @@ class HomeScreenState extends State .indexWhere((x) => x.superIdentity.recordKey == activeLocalAccount); final canClose = activeIndex != -1; - return SafeArea( - child: DefaultTextStyle( - style: theme.textTheme.bodySmall!, - child: ZoomDrawer( - controller: _zoomDrawerController, - menuScreen: Builder(builder: (context) { - final zoomDrawer = ZoomDrawer.of(context); - zoomDrawer!.stateNotifier.addListener(() { - if (zoomDrawer.isOpen()) { - FocusManager.instance.primaryFocus?.unfocus(); - } - }); - return const DrawerMenu(); - }), - mainScreen: Provider.value( - value: _zoomDrawerController, - child: Builder(builder: _buildAccountPageView)), - borderRadius: 0, - angle: 0, - //mainScreenOverlayColor: theme.shadowColor.withAlpha(0x2F), - openCurve: Curves.fastEaseInToSlowEaseOut, - closeCurve: Curves.fastEaseInToSlowEaseOut, - // duration: const Duration(milliseconds: 250), - // reverseDuration: const Duration(milliseconds: 250), - menuScreenTapClose: canClose, - mainScreenTapClose: canClose, - disableDragGesture: !canClose, - mainScreenScale: .25, - slideWidth: min(360, MediaQuery.of(context).size.width * 0.9), - ))); + Widget homeWidget = DefaultTextStyle( + style: theme.textTheme.bodySmall!, + child: ZoomDrawer( + controller: _zoomDrawerController, + menuScreen: Builder(builder: (context) { + final zoomDrawer = ZoomDrawer.of(context); + zoomDrawer!.stateNotifier.addListener(() { + if (zoomDrawer.isOpen()) { + FocusManager.instance.primaryFocus?.unfocus(); + } + }); + return const DrawerMenu(); + }), + mainScreen: Provider.value( + value: _zoomDrawerController, + child: Builder(builder: _buildAccountPageView)), + borderRadius: 0, + angle: 0, + //mainScreenOverlayColor: theme.shadowColor.withAlpha(0x2F), + openCurve: Curves.fastEaseInToSlowEaseOut, + closeCurve: Curves.fastEaseInToSlowEaseOut, + // duration: const Duration(milliseconds: 250), + // reverseDuration: const Duration(milliseconds: 250), + menuScreenTapClose: canClose, + mainScreenTapClose: canClose, + disableDragGesture: !canClose, + mainScreenScale: .25, + slideWidth: min(360, MediaQuery.of(context).size.width * 0.9), + )); + + if (isiOS || isAndroid) { + homeWidget = NativeSafeArea( + bottom: false, left: false, right: false, child: homeWidget); + } + + return homeWidget; } ////////////////////////////////////////////////////////////////////////////