From 975c9c5a08700b44d392d65cfa50c4818f07cb3d Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Fri, 5 Sep 2025 21:38:10 +0200 Subject: [PATCH] fix: native status bar theming --- firka/lib/main.dart | 31 ++++++++++++++++++- firka/lib/ui/model/style.dart | 6 +++- .../ui/phone/screens/home/home_screen.dart | 18 ----------- .../ui/phone/screens/login/login_screen.dart | 6 ---- .../screens/settings/settings_screen.dart | 16 ---------- .../screens/wear_login/wear_login_screen.dart | 6 ---- 6 files changed, 35 insertions(+), 48 deletions(-) diff --git a/firka/lib/main.dart b/firka/lib/main.dart index f9bb575..35d9ef1 100644 --- a/firka/lib/main.dart +++ b/firka/lib/main.dart @@ -136,15 +136,19 @@ void initTheme(AppInitialization data) { .activeIndex) { case 1: appStyle = lightStyle; + isLightMode.value = true; break; case 2: appStyle = darkStyle; + isLightMode.value = false; break; default: if (brightness == Brightness.dark) { appStyle = darkStyle; + isLightMode.value = true; } else { appStyle = lightStyle; + isLightMode.value = false; } } } @@ -243,6 +247,8 @@ void main() async { }); } +final ValueNotifier isLightMode = ValueNotifier(true); + class InitializationScreen extends StatelessWidget { InitializationScreen({super.key}); @@ -335,7 +341,30 @@ class InitializationScreen extends StatelessWidget { GlobalWidgetsLocalizations.delegate, ], supportedLocales: AppLocalizations.supportedLocales, - home: DefaultAssetBundle(bundle: FirkaBundle(), child: screen), + home: DefaultAssetBundle( + bundle: FirkaBundle(), + child: ValueListenableBuilder( + valueListenable: isLightMode, + builder: (context, isLight, _) { + final overlay = SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: + isLight ? Brightness.dark : Brightness.light, + statusBarBrightness: + isLight ? Brightness.light : Brightness.dark, + systemStatusBarContrastEnforced: false, + ); + + // Ensure system is updated immediately + SystemChrome.setSystemUIOverlayStyle(overlay); + + return AnnotatedRegion( + value: overlay, + child: screen, + ); + }, + ), + ), routes: { '/login': (context) => DefaultAssetBundle( bundle: FirkaBundle(), diff --git a/firka/lib/ui/model/style.dart b/firka/lib/ui/model/style.dart index e9aadfc..f02eb70 100644 --- a/firka/lib/ui/model/style.dart +++ b/firka/lib/ui/model/style.dart @@ -116,8 +116,10 @@ class FirkaColors { class FirkaStyle { FirkaColors colors; FirkaFonts fonts; + bool isLight; - FirkaStyle({required this.colors, required this.fonts}); + FirkaStyle( + {required this.isLight, required this.colors, required this.fonts}); } final _defaultFonts = FirkaFonts( @@ -196,6 +198,7 @@ final _defaultFonts = FirkaFonts( ); final FirkaStyle lightStyle = FirkaStyle( + isLight: true, colors: FirkaColors( background: Color(0xFFFAFFF0), backgroundAmoled: Colors.black, @@ -230,6 +233,7 @@ final FirkaStyle lightStyle = FirkaStyle( fonts: _defaultFonts); final FirkaStyle darkStyle = FirkaStyle( + isLight: false, colors: FirkaColors( background: Color(0xFF0D1202), backgroundAmoled: Colors.black, diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index d8535db..62075e5 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -245,9 +245,6 @@ class _HomeScreenState extends State { @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - _updateSystemUI(); - }); widget.data.settingsUpdateNotifier.addListener(settingsUpdateListener); @@ -280,17 +277,6 @@ class _HomeScreenState extends State { } } - void _updateSystemUI() { - SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark, - statusBarColor: Colors.transparent, - systemNavigationBarColor: appStyle.colors.background, - systemNavigationBarIconBrightness: Brightness.dark, - systemNavigationBarDividerColor: Colors.transparent, - )); - } - void _onRefresh() async { late void Function() finishListener; finishListener = () { @@ -310,8 +296,6 @@ class _HomeScreenState extends State { @override Widget build(BuildContext context) { - _updateSystemUI(); // Update system UI on every build, to compensate for the android system being dumb - if (!widget.data.settings.group("settings").boolean("beta_warning")) { Timer.run(() { Navigator.of(context).pushAndRemoveUntil( @@ -580,8 +564,6 @@ class _HomeScreenState extends State { _pageController.dispose(); super.dispose(); - widget.data.settingsUpdateNotifier.removeListener(settingsUpdateListener); - _disposed = true; _fetching = false; _prefetched = false; diff --git a/firka/lib/ui/phone/screens/login/login_screen.dart b/firka/lib/ui/phone/screens/login/login_screen.dart index e4647ef..ea9d715 100644 --- a/firka/lib/ui/phone/screens/login/login_screen.dart +++ b/firka/lib/ui/phone/screens/login/login_screen.dart @@ -31,12 +31,6 @@ class _LoginScreenState extends State { _loginWebView = LoginWebviewWidget(widget.data); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark, - statusBarColor: Colors.transparent, - systemNavigationBarColor: Color(0xFFFAFFF0), - )); _preloadImages(); } diff --git a/firka/lib/ui/phone/screens/settings/settings_screen.dart b/firka/lib/ui/phone/screens/settings/settings_screen.dart index 2f4b494..1ca4f7f 100644 --- a/firka/lib/ui/phone/screens/settings/settings_screen.dart +++ b/firka/lib/ui/phone/screens/settings/settings_screen.dart @@ -33,9 +33,6 @@ class _SettingsScreenState extends State { @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - _updateSystemUI(); - }); activeIcon = widget.data.settings .group("settings") @@ -44,17 +41,6 @@ class _SettingsScreenState extends State { .iconString("icon_picker"); } - void _updateSystemUI() { - SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark, - statusBarColor: Colors.transparent, - systemNavigationBarColor: appStyle.colors.background, - systemNavigationBarIconBrightness: Brightness.dark, - systemNavigationBarDividerColor: Colors.transparent, - )); - } - List createWidgetTree( Iterable items, SettingsStore settings, {bool forceRender = false}) { @@ -506,8 +492,6 @@ class _SettingsScreenState extends State { @override Widget build(BuildContext context) { - _updateSystemUI(); // Update system UI on every build, to compensate for the android system being dumb - var body = createWidgetTree(widget.items.values, widget.data.settings); return Scaffold( diff --git a/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart b/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart index dbe2897..874a0ac 100644 --- a/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart +++ b/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart @@ -96,12 +96,6 @@ class _WearLoginScreenState extends State { })); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark, - statusBarColor: Colors.transparent, - systemNavigationBarColor: Color(0xFFDAE4F7), - )); } @override