From 2af2364ee44cfc06fd7d57bdb6c78470807983d3 Mon Sep 17 00:00:00 2001 From: Frank Gregor Date: Thu, 2 Apr 2020 11:43:34 +0200 Subject: [PATCH] OT-717: Unreadable Status Bar Fixes #449 BUGFIX * Fixes a bug that happens on switching between Light and Dark mode, which results in an unreadable system status bar ADDITIONS & CHANGES * Adds a new `ThemeKey` enum value `system` * Changes setting for Light/Dark mode in user profile by removing the switch * Adds a new screen for switching application appearance to `Light`/`Dark` or `System` * Refactors all `ThemeKey` enum values from UPPERCASE to lowercase * Adds `vibrateLight` method for haptic feedback when user changes appearance * Adds new assets for all three theme states: Light, Dark, System * Cleans up code ADDITIONAL NOTES * Adds `activeColor` setting to all used `Switch.adaptive` widgets with the value of `CustomTheme.of(context).accent`, because on iOS they had the default green color which doesn't fit our application color theme. * Adds `Preference` class with just two static methods `set({@required value, @required String forKey})` and `value({@required String forKey})` for convenience and better readability * Adds static getter/setter on `Preference` class for easier handling of preference values and better readability (NOTE: Should be discussed if we adopt this system overall) So instead of calling: ``` setPreference(preferenceAppThemeKey, ThemeKey.light.toString()); ``` we can call: ``` Preference.themeKey = ThemeKey.light.toString(); ``` --- assets/images/2.0x/theme_coi_dark.png | Bin 0 -> 11710 bytes assets/images/2.0x/theme_coi_light.png | Bin 0 -> 11508 bytes assets/images/2.0x/theme_coi_system.png | Bin 0 -> 18212 bytes assets/images/3.0x/theme_coi_dark.png | Bin 0 -> 20133 bytes assets/images/3.0x/theme_coi_light.png | Bin 0 -> 20001 bytes assets/images/3.0x/theme_coi_system.png | Bin 0 -> 31501 bytes assets/images/theme_coi_dark.png | Bin 0 -> 4902 bytes assets/images/theme_coi_light.png | Bin 0 -> 4767 bytes assets/images/theme_coi_system.png | Bin 0 -> 8049 bytes lib/main.dart | 19 +- lib/src/brandable/brandable_icon.dart | 4 +- lib/src/brandable/branded_theme.dart | 2 +- lib/src/brandable/custom_theme.dart | 80 +++++-- lib/src/l10n/l.dart | 8 +- lib/src/navigation/navigatable.dart | 1 + lib/src/navigation/navigation.dart | 5 +- lib/src/platform/preferences.dart | 18 +- lib/src/settings/settings_anti_mobbing.dart | 7 +- lib/src/settings/settings_appearance.dart | 202 ++++++++++++++++++ .../settings/settings_appearance_bloc.dart | 63 ++++++ .../settings_appearance_event_state.dart | 68 ++++++ lib/src/settings/settings_chat.dart | 10 +- lib/src/settings/settings_notifications.dart | 10 +- .../settings/settings_notifications_bloc.dart | 3 +- lib/src/ui/text_styles.dart | 8 +- lib/src/user/user_profile.dart | 23 +- lib/src/utils/keyMapping.dart | 1 + lib/src/utils/vibration.dart | 4 +- lib/src/widgets/settings_item.dart | 1 + 29 files changed, 475 insertions(+), 62 deletions(-) create mode 100644 assets/images/2.0x/theme_coi_dark.png create mode 100644 assets/images/2.0x/theme_coi_light.png create mode 100644 assets/images/2.0x/theme_coi_system.png create mode 100644 assets/images/3.0x/theme_coi_dark.png create mode 100644 assets/images/3.0x/theme_coi_light.png create mode 100644 assets/images/3.0x/theme_coi_system.png create mode 100644 assets/images/theme_coi_dark.png create mode 100644 assets/images/theme_coi_light.png create mode 100644 assets/images/theme_coi_system.png create mode 100644 lib/src/settings/settings_appearance.dart create mode 100644 lib/src/settings/settings_appearance_bloc.dart create mode 100644 lib/src/settings/settings_appearance_event_state.dart diff --git a/assets/images/2.0x/theme_coi_dark.png b/assets/images/2.0x/theme_coi_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c07fec1638b48aff2071e9d25fb685c792f0a7ac GIT binary patch literal 11710 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 IIn(F=0xup=hX4Qo literal 0 HcmV?d00001 diff --git a/assets/images/2.0x/theme_coi_light.png b/assets/images/2.0x/theme_coi_light.png new file mode 100644 index 0000000000000000000000000000000000000000..8da8a20eff355869078c0fb6c98f167936ddc2c4 GIT binary patch literal 11508 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 Mr!HGAZT|Xy0cmv-asU7T literal 0 HcmV?d00001 diff --git a/assets/images/2.0x/theme_coi_system.png b/assets/images/2.0x/theme_coi_system.png new file mode 100644 index 0000000000000000000000000000000000000000..620dcc78940badb67751bb89b8c9c93550ec9dac GIT binary patch literal 18212 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

ex^;gR{5d%}v6PZER6n8o4XSio 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 literal 0 HcmV?d00001 diff --git a/assets/images/3.0x/theme_coi_system.png b/assets/images/3.0x/theme_coi_system.png new file mode 100644 index 0000000000000000000000000000000000000000..33348c3d7a91ad5fb5a61178c81842a11f760172 GIT binary patch literal 31501 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 literal 0 HcmV?d00001 diff --git a/assets/images/theme_coi_dark.png b/assets/images/theme_coi_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe39b1b639245052729903d0f0f292cd45541d2 GIT binary patch literal 4902 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 TL)p3g=W|F)Ll04{_9*P{nJj<9 literal 0 HcmV?d00001 diff --git a/assets/images/theme_coi_system.png b/assets/images/theme_coi_system.png new file mode 100644 index 0000000000000000000000000000000000000000..bfeeebfec532a31c284bb59a3362de7d843d57e3 GIT binary patch literal 8049 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index b7e4ff81..a27560e1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -91,7 +91,7 @@ void main() { ), ], child: CustomTheme( - initialThemeKey: ThemeKey.LIGHT, + initialThemeKey: ThemeKey.light, child: OxCoiApp(), ), ), @@ -104,20 +104,23 @@ class OxCoiApp extends StatelessWidget { @override Widget build(BuildContext context) { var customTheme = CustomTheme.of(context); - return MaterialApp( - theme: ThemeData( + final themeData = ThemeData( brightness: customTheme.brightness, backgroundColor: customTheme.background, scaffoldBackgroundColor: customTheme.background, toggleableActiveColor: customTheme.accent, accentColor: customTheme.accent, primaryIconTheme: Theme.of(context).primaryIconTheme.copyWith( - color: customTheme.onSurface, - ), + color: customTheme.onSurface, + ), primaryTextTheme: Theme.of(context).primaryTextTheme.apply( - bodyColor: customTheme.onSurface, - ), - ), + bodyColor: customTheme.onSurface, + ), + ); + + return MaterialApp( + theme: themeData, + themeMode: customTheme.brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark, localizationsDelegates: getLocalizationsDelegates(), supportedLocales: L10n.supportedLocales, localeResolutionCallback: (deviceLocale, supportedLocales) { diff --git a/lib/src/brandable/brandable_icon.dart b/lib/src/brandable/brandable_icon.dart index ef86adf8..23efdd21 100644 --- a/lib/src/brandable/brandable_icon.dart +++ b/lib/src/brandable/brandable_icon.dart @@ -103,7 +103,7 @@ enum IconSource { retry, checkedCircle, circle, - darkMode, + appearance, qr, signature, serverSetting, @@ -173,7 +173,7 @@ const iconData = { IconSource.retry: Icons.autorenew, IconSource.checkedCircle: Icons.check_circle, IconSource.circle: Icons.radio_button_unchecked, - IconSource.darkMode: Icons.brightness_2, + IconSource.appearance: Icons.palette, IconSource.qr: Icons.filter_center_focus, IconSource.signature: Icons.gesture, IconSource.serverSetting: Icons.router, diff --git a/lib/src/brandable/branded_theme.dart b/lib/src/brandable/branded_theme.dart index 66e12c61..aca3129a 100644 --- a/lib/src/brandable/branded_theme.dart +++ b/lib/src/brandable/branded_theme.dart @@ -52,7 +52,7 @@ class BrandedTheme { final Color chatIcon = Colors.lightBlue[800]; final Color signatureIcon = Colors.blue[600]; final Color serverSettingsIcon = Colors.indigo[600]; - final Color darkModeIcon = Colors.deepPurple[500]; + final Color appearanceIcon = Colors.deepPurple[500]; final Color dataProtectionIcon = Colors.purple[400]; final Color blockIcon = Colors.pink[500]; final Color encryptionIcon = Colors.red[600]; diff --git a/lib/src/brandable/custom_theme.dart b/lib/src/brandable/custom_theme.dart index c0c6b641..e5bc2c3d 100644 --- a/lib/src/brandable/custom_theme.dart +++ b/lib/src/brandable/custom_theme.dart @@ -40,14 +40,16 @@ * for more details. */ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:ox_coi/src/platform/preferences.dart'; - -import 'branded_theme.dart'; +import 'package:ox_coi/src/brandable/branded_theme.dart'; enum ThemeKey { - LIGHT, - DARK, + system, + light, + dark, } class CustomerThemes { @@ -93,12 +95,13 @@ class CustomerThemes { static BrandedTheme getThemeFromKey(ThemeKey themeKey) { switch (themeKey) { - case ThemeKey.LIGHT: + case ThemeKey.light: return lightTheme; - case ThemeKey.DARK: + case ThemeKey.dark: return darkTheme; default: - return lightTheme; + final brightness = WidgetsBinding.instance.window.platformBrightness; + return brightness == Brightness.light ? lightTheme : darkTheme; } } } @@ -122,11 +125,7 @@ class CustomTheme extends StatefulWidget { final Widget child; final ThemeKey initialThemeKey; - const CustomTheme({ - Key key, - this.initialThemeKey, - @required this.child, - }) : super(key: key); + const CustomTheme({Key key, this.initialThemeKey, @required this.child}) : super(key: key); @override CustomThemeState createState() => new CustomThemeState(); @@ -140,6 +139,24 @@ class CustomTheme extends StatefulWidget { _CustomTheme inherited = (context.dependOnInheritedWidgetOfExactType<_CustomTheme>()); return inherited.data; } + + static ThemeKey getThemeKeyFor({@required String name}) { + if (name == describeEnum(ThemeKey.system)) { + return ThemeKey.system; + } else if (name == describeEnum(ThemeKey.light)) { + return ThemeKey.light; + } else { + return ThemeKey.dark; + } + } + + static ThemeKey get systemThemeKey { + final brightness = WidgetsBinding.instance.window.platformBrightness; + if (brightness == Brightness.light) { + return ThemeKey.light; + } + return ThemeKey.dark; + } } class CustomThemeState extends State with WidgetsBindingObserver { @@ -169,23 +186,42 @@ class CustomThemeState extends State with WidgetsBindingObserver { _checkSavedTheme(); } - void _checkSavedTheme() async{ - var newThemeKey; - String savedThemeKey = await getPreference(preferenceAppThemeKey); - if(savedThemeKey == null){ - final Brightness brightness = WidgetsBinding.instance.window.platformBrightness; - newThemeKey = brightness == Brightness.light ? ThemeKey.LIGHT : ThemeKey.DARK; - }else{ - newThemeKey = savedThemeKey.compareTo(ThemeKey.LIGHT.toString()) == 0 ? ThemeKey.LIGHT : ThemeKey.DARK; + void _checkSavedTheme() async { + var savedThemeKeyString = await Preference.themeKey; + + ThemeKey savedThemeKey; + if (savedThemeKeyString == null) { + savedThemeKey = ThemeKey.system; + savedThemeKeyString = describeEnum(savedThemeKey); + Preference.themeKey = savedThemeKeyString; + } + + ThemeKey newThemeKey; + if (savedThemeKey == ThemeKey.system) { + final platformBrightness = WidgetsBinding.instance.window.platformBrightness; + newThemeKey = platformBrightness == Brightness.light ? ThemeKey.light : ThemeKey.dark; + } else { + newThemeKey = CustomTheme.getThemeKeyFor(name: savedThemeKeyString); } - changeTheme(newThemeKey); + + changeTheme(themeKey: newThemeKey, preservePreference: true); } - void changeTheme(ThemeKey themeKey) { + void changeTheme({@required ThemeKey themeKey, bool preservePreference = false}) async { setState(() { _actualThemeKey = themeKey; _theme = CustomerThemes.getThemeFromKey(themeKey); }); + + if (!preservePreference) { + Preference.themeKey = describeEnum(themeKey); + } + + SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( + statusBarColor: CustomerThemes.getThemeFromKey(themeKey).background, // Android only + statusBarIconBrightness: themeKey == ThemeKey.dark ? Brightness.light : Brightness.dark, // Android only + statusBarBrightness: themeKey == ThemeKey.dark ? Brightness.dark : Brightness.light // iOS only + )); } @override diff --git a/lib/src/l10n/l.dart b/lib/src/l10n/l.dart index 5c7a6e56..26f947e0 100644 --- a/lib/src/l10n/l.dart +++ b/lib/src/l10n/l.dart @@ -429,7 +429,6 @@ class L { static final settingItemChatTitle = _translationKey("Chat"); static final settingItemSignatureTitle = _translationKey("Email signature"); static final settingItemServerSettingsTitle = _translationKey("Server settings"); - static final settingItemDarkModeTitle = _translationKey("Dark mode"); static final settingItemDataProtectionTitle = _translationKey("Data protection"); static final settingItemBlockedTitle = _translationKey("Blocked contacts"); static final settingItemEncryptionTitle = _translationKey("Encryption"); @@ -437,6 +436,13 @@ class L { static final settingItemFeedbackTitle = _translationKey("Feedback"); static final settingItemBugReportTitle = _translationKey("Report a bug"); + static final settingsAppearanceTitle = _translationKey("Appearance"); + static final settingsAppearanceSystemTitle = _translationKey("System"); + static final settingsAppearanceDarkTitle = _translationKey("Dark"); + static final settingsAppearanceLightTitle = _translationKey("Light"); + static final settingsAppearanceDescritpion = _translationKey("Here you can choose your favorite theme. If you choose '%s', the theme may change automatically. This depends on whether you have selected 'Automatic' in the system preferences or not."); + static final settingsAppearanceSystemThemeDescription = _translationKey("Current System theme is: %s"); + static List _translationKey(String key, [String pluralKey]) { String logging = "Registered localization key: '$key'"; if (!pluralKey.isNullOrEmpty()) { diff --git a/lib/src/navigation/navigatable.dart b/lib/src/navigation/navigatable.dart index 7e4e75df..ac7a7fc1 100644 --- a/lib/src/navigation/navigatable.dart +++ b/lib/src/navigation/navigatable.dart @@ -99,6 +99,7 @@ enum Type { settingsKeyTransferDoneDialog, settingsAutocryptImport, settingsNotifications, + settingsAppearance, splash, share, showQr, diff --git a/lib/src/navigation/navigation.dart b/lib/src/navigation/navigation.dart index 344f95f2..ec9f46f4 100644 --- a/lib/src/navigation/navigation.dart +++ b/lib/src/navigation/navigation.dart @@ -53,10 +53,11 @@ import 'package:ox_coi/src/navigation/navigatable.dart'; import 'package:ox_coi/src/settings/settings.dart'; import 'package:ox_coi/src/settings/settings_about.dart'; import 'package:ox_coi/src/settings/settings_anti_mobbing.dart'; +import 'package:ox_coi/src/settings/settings_appearance.dart'; import 'package:ox_coi/src/settings/settings_chat.dart'; import 'package:ox_coi/src/settings/settings_debug.dart'; -import 'package:ox_coi/src/settings/settings_notifications.dart'; import 'package:ox_coi/src/settings/settings_encryption.dart'; +import 'package:ox_coi/src/settings/settings_notifications.dart'; import 'package:ox_coi/src/user/user_account_settings.dart'; class Navigation { @@ -70,6 +71,7 @@ class Navigation { static const String settingsAbout = '/settings/about'; static const String settingsChat = '/settings/chat'; static const String settingsAntiMobbing = '/settings/antiMobbing'; + static const String settingsAppearance = '/settings/appearance'; static const String settingsNotifications = '/settings/notifications'; static const String settingsAntiMobbingList = '/settings/antiMobbingList'; static const String settingsDebug = '/settings/debug'; @@ -86,6 +88,7 @@ class Navigation { settingsChat: (context) => SettingsChat(), settingsAntiMobbing: (context) => SettingsAntiMobbing(), settingsAntiMobbingList: (context) => AntiMobbingList(), + settingsAppearance: (context) => SettingsAppearance(), settingsNotifications: (context) => SettingsNotifications(), settingsDebug: (context) => SettingsDebug(), chatCreate: (context) => ChatCreate(), diff --git a/lib/src/platform/preferences.dart b/lib/src/platform/preferences.dart index a7405fd0..2d4c726f 100644 --- a/lib/src/platform/preferences.dart +++ b/lib/src/platform/preferences.dart @@ -40,6 +40,7 @@ * for more details. */ +import 'package:flutter/cupertino.dart'; import 'package:shared_preferences/shared_preferences.dart'; const preferenceSystemContactsImportShown = "preferenceSystemContactsImportShown"; @@ -54,7 +55,6 @@ const preferenceNotificationsPushStatus = "preferenceNotificationsPushStatus"; const preferenceAppState = "preferenceAppState"; const preferenceInviteServiceUrl = "preferenceInviteServiceUrl"; const preferenceHasAuthenticationError = "preferenceHasAuthenticationError"; -const preferenceAppThemeKey = "preferenceAppThemeKey"; const preferenceNotificationsAuth = "preferenceNotificationsAuth"; // Unused const preferenceNotificationsP256dhPublic = "preferenceNotificationsP256dhPublic"; // Unused @@ -96,4 +96,20 @@ Future removePreference(String key) async { Future clearPreferences() async { SharedPreferences sharedPreferences = await getSharedPreferences(); await sharedPreferences.clear(); +} + +class Preference { + + static const _themeKey = "themeKey"; + static Future get themeKey async => await value(forKey: _themeKey); + static set themeKey(String value) => set(value: value, forKey: _themeKey); + + static set({@required value, @required String forKey}) async { + await setPreference(forKey, value); + } + + static value({@required String forKey}) async { + return await getPreference(forKey); + } + } \ No newline at end of file diff --git a/lib/src/settings/settings_anti_mobbing.dart b/lib/src/settings/settings_anti_mobbing.dart index bfe3418a..695ba6ef 100644 --- a/lib/src/settings/settings_anti_mobbing.dart +++ b/lib/src/settings/settings_anti_mobbing.dart @@ -44,6 +44,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ox_coi/src/brandable/brandable_icon.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; import 'package:ox_coi/src/l10n/l.dart'; import 'package:ox_coi/src/l10n/l10n.dart'; import 'package:ox_coi/src/navigation/navigatable.dart'; @@ -93,7 +94,11 @@ class _SettingsAntiMobbingState extends State { contentPadding: EdgeInsets.symmetric(vertical: listItemPadding, horizontal: listItemPadding), title: Text(L10n.get(L.settingAntiMobbing)), subtitle: Text(L10n.get(L.settingAntiMobbingText)), - trailing: Switch.adaptive(value: state.antiMobbingActive, onChanged: (value) => _changeAntiMobbingSetting()), + trailing: Switch.adaptive( + value: state.antiMobbingActive, + onChanged: (value) => _changeAntiMobbingSetting(), + activeColor: CustomTheme.of(context).accent, + ), ), Visibility( visible: state.antiMobbingActive, diff --git a/lib/src/settings/settings_appearance.dart b/lib/src/settings/settings_appearance.dart new file mode 100644 index 00000000..f1914ebd --- /dev/null +++ b/lib/src/settings/settings_appearance.dart @@ -0,0 +1,202 @@ +/* + * OPEN-XCHANGE legal information + * + * All intellectual property rights in the Software are protected by + * international copyright laws. + * + * + * In some countries OX, OX Open-Xchange and open xchange + * as well as the corresponding Logos OX Open-Xchange and OX are registered + * trademarks of the OX Software GmbH group of companies. + * The use of the Logos is not covered by the Mozilla Public License 2.0 (MPL 2.0). + * Instead, you are allowed to use these Logos according to the terms and + * conditions of the Creative Commons License, Version 2.5, Attribution, + * Non-commercial, ShareAlike, and the interpretation of the term + * Non-commercial applicable to the aforementioned license is published + * on the web site https://www.open-xchange.com/terms-and-conditions/. + * + * Please make sure that third-party modules and libraries are used + * according to their respective licenses. + * + * Any modifications to this package must retain all copyright notices + * of the original copyright holder(s) for the original code used. + * + * After any such modifications, the original and derivative code shall remain + * under the copyright of the copyright holder(s) and/or original author(s) as stated here: + * https://www.open-xchange.com/legal/. The contributing author shall be + * given Attribution for the derivative code and a license granting use. + * + * Copyright (C) 2016-2020 OX Software GmbH + * Mail: info@open-xchange.com + * + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the Mozilla Public License 2.0 + * for more details. + */ + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:ox_coi/src/brandable/brandable_icon.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; +import 'package:ox_coi/src/extensions/color_apis.dart'; +import 'package:ox_coi/src/l10n/l.dart'; +import 'package:ox_coi/src/l10n/l10n.dart'; +import 'package:ox_coi/src/navigation/navigatable.dart'; +import 'package:ox_coi/src/navigation/navigation.dart'; +import 'package:ox_coi/src/settings/settings_appearance_bloc.dart'; +import 'package:ox_coi/src/settings/settings_appearance_event_state.dart'; +import 'package:ox_coi/src/ui/dimensions.dart'; +import 'package:ox_coi/src/utils/vibration.dart'; +import 'package:ox_coi/src/widgets/dynamic_appbar.dart'; +import 'package:ox_coi/src/widgets/state_info.dart'; + +class SettingsAppearance extends StatefulWidget { + static get viewTitle => L10n.get(L.settingsAppearanceTitle); + + SettingsAppearance(); + + @override + _SettingsAppearanceState createState() => _SettingsAppearanceState(); +} + +class _SettingsAppearanceState extends State { + SettingsAppearanceBloc _settingsAppearanceBloc = SettingsAppearanceBloc(); + Navigation _navigation = Navigation(); + + @override + void initState() { + super.initState(); + _navigation.current = Navigatable(Type.settingsAppearance); + _settingsAppearanceBloc.add(LoadAppearance()); + } + + @override + Widget build(BuildContext context) { + return BlocBuilder( + bloc: _settingsAppearanceBloc, + builder: (context, state) { + if (state is SettingsAppearanceStateInitial) { + return StateInfo(showLoading: true); + } else if (state is SettingsAppearanceStateLoaded) { + return _buildAppearanceSelector(selectedTheme: state.themeKey); + } else { + return Center( + child: AdaptiveIcon(icon: IconSource.error), + ); + } + }); + } + + Widget _buildAppearanceSelector({@required ThemeKey selectedTheme}) { + return Scaffold( + appBar: DynamicAppBar( + title: SettingsAppearance.viewTitle, + leading: AppBarBackButton(context: context), + ), + body: _AppearanceSelector( + themeItemData: { + ThemeKey.light: L10n.get(L.settingsAppearanceLightTitle), + ThemeKey.dark: L10n.get(L.settingsAppearanceDarkTitle), + ThemeKey.system: L10n.get(L.settingsAppearanceSystemTitle), + }, + selectedTheme: selectedTheme, + onChanged: _appearanceChanged, + ) + ); + } + + void _appearanceChanged(ThemeKey theme) async { + vibrateLight(); + CustomTheme.instanceOf(context).changeTheme(themeKey: theme); + _settingsAppearanceBloc.add(AppearanceLoaded(themeKey: theme)); + } +} + +class _AppearanceSelector extends StatelessWidget { + final Map themeItemData; + final ThemeKey selectedTheme; + final ValueChanged onChanged; + + const _AppearanceSelector({Key key, @required this.themeItemData, @required this.selectedTheme, @required this.onChanged}) : super(key: key); + + @override + Widget build(BuildContext context) { + final systemTheme = themeItemData[CustomTheme.systemThemeKey]; + + return Container( + padding: EdgeInsets.all(dimension32dp), + color: CustomTheme.of(context).background, + child: Column( + children: [ + Container( + padding: EdgeInsets.only(bottom: dimension32dp), + child: Text( + L10n.getFormatted(L.settingsAppearanceDescritpion, [L10n.get(L.settingsAppearanceSystemTitle)]), + ) + ), + Row( + children: [ + for (var themeKey in themeItemData.keys) + _buildAppearanceSelectorItem(context, themeKey), + ], + ), + ], + ), + ); + } + + Widget _buildAppearanceSelectorItem(BuildContext context, ThemeKey themeKey) { + return Expanded( + child: GestureDetector( + onTap: () => onChanged(themeKey), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(left: dimension8dp, right: dimension8dp), + padding: EdgeInsets.all(dimension16dp), + decoration: BoxDecoration( + color: selectedTheme == themeKey ? CustomTheme.of(context).surface : CustomTheme.of(context).background, + borderRadius: BorderRadius.all(Radius.circular(dimension8dp)), + border: selectedTheme == themeKey ? Border.all(color: CustomTheme.of(context).onBackground.barely()) : null, + ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: dimension16dp), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(dimension4dp)), + border: Border.all(color: CustomTheme.of(context).onBackground.slightly()), + ), + child: Image( + image: AssetImage('assets/images/theme_coi_${describeEnum(themeKey)}.png'), + ), + ), + ), + Text( + themeItemData[themeKey], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(bottom: dimension16dp), + child: Radio( + value: themeKey, + groupValue: selectedTheme, + onChanged: (value) => onChanged(themeKey), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/src/settings/settings_appearance_bloc.dart b/lib/src/settings/settings_appearance_bloc.dart new file mode 100644 index 00000000..6315869a --- /dev/null +++ b/lib/src/settings/settings_appearance_bloc.dart @@ -0,0 +1,63 @@ +/* + * OPEN-XCHANGE legal information + * + * All intellectual property rights in the Software are protected by + * international copyright laws. + * + * + * In some countries OX, OX Open-Xchange and open xchange + * as well as the corresponding Logos OX Open-Xchange and OX are registered + * trademarks of the OX Software GmbH group of companies. + * The use of the Logos is not covered by the Mozilla Public License 2.0 (MPL 2.0). + * Instead, you are allowed to use these Logos according to the terms and + * conditions of the Creative Commons License, Version 2.5, Attribution, + * Non-commercial, ShareAlike, and the interpretation of the term + * Non-commercial applicable to the aforementioned license is published + * on the web site https://www.open-xchange.com/terms-and-conditions/. + * + * Please make sure that third-party modules and libraries are used + * according to their respective licenses. + * + * Any modifications to this package must retain all copyright notices + * of the original copyright holder(s) for the original code used. + * + * After any such modifications, the original and derivative code shall remain + * under the copyright of the copyright holder(s) and/or original author(s) as stated here: + * https://www.open-xchange.com/legal/. The contributing author shall be + * given Attribution for the derivative code and a license granting use. + * + * Copyright (C) 2016-2020 OX Software GmbH + * Mail: info@open-xchange.com + * + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the Mozilla Public License 2.0 + * for more details. + */ + +import 'package:bloc/bloc.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; +import 'package:ox_coi/src/platform/preferences.dart'; +import 'package:ox_coi/src/settings/settings_appearance_event_state.dart'; + +class SettingsAppearanceBloc extends Bloc { + @override + SettingsAppearanceState get initialState => SettingsAppearanceStateInitial(); + + @override + Stream mapEventToState(SettingsAppearanceEvent event) async* { + if (event is LoadAppearance) { + final themeKeyString = await Preference.themeKey; + final savedThemeKey = CustomTheme.getThemeKeyFor(name: themeKeyString); + add(AppearanceLoaded(themeKey: savedThemeKey)); + + } else if (event is AppearanceLoaded) { + yield SettingsAppearanceStateLoaded(themeKey: event.themeKey); + } + } +} diff --git a/lib/src/settings/settings_appearance_event_state.dart b/lib/src/settings/settings_appearance_event_state.dart new file mode 100644 index 00000000..72cf0e32 --- /dev/null +++ b/lib/src/settings/settings_appearance_event_state.dart @@ -0,0 +1,68 @@ +/* + * OPEN-XCHANGE legal information + * + * All intellectual property rights in the Software are protected by + * international copyright laws. + * + * + * In some countries OX, OX Open-Xchange and open xchange + * as well as the corresponding Logos OX Open-Xchange and OX are registered + * trademarks of the OX Software GmbH group of companies. + * The use of the Logos is not covered by the Mozilla Public License 2.0 (MPL 2.0). + * Instead, you are allowed to use these Logos according to the terms and + * conditions of the Creative Commons License, Version 2.5, Attribution, + * Non-commercial, ShareAlike, and the interpretation of the term + * Non-commercial applicable to the aforementioned license is published + * on the web site https://www.open-xchange.com/terms-and-conditions/. + * + * Please make sure that third-party modules and libraries are used + * according to their respective licenses. + * + * Any modifications to this package must retain all copyright notices + * of the original copyright holder(s) for the original code used. + * + * After any such modifications, the original and derivative code shall remain + * under the copyright of the copyright holder(s) and/or original author(s) as stated here: + * https://www.open-xchange.com/legal/. The contributing author shall be + * given Attribution for the derivative code and a license granting use. + * + * Copyright (C) 2016-2020 OX Software GmbH + * Mail: info@open-xchange.com + * + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the Mozilla Public License 2.0 + * for more details. + */ + +// Bloc Events + +import 'package:flutter/cupertino.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; + +mixin SettingsAppearanceEvent {} + +class LoadAppearance with SettingsAppearanceEvent {} + +class AppearanceLoaded with SettingsAppearanceEvent { + final ThemeKey themeKey; + + AppearanceLoaded({@required this.themeKey}); +} + +// Bloc States + +mixin SettingsAppearanceState {} + +class SettingsAppearanceStateInitial with SettingsAppearanceState {} + +class SettingsAppearanceStateLoaded with SettingsAppearanceState { + final ThemeKey themeKey; + + SettingsAppearanceStateLoaded({@required this.themeKey}); +} diff --git a/lib/src/settings/settings_chat.dart b/lib/src/settings/settings_chat.dart index 8a9057b4..66eee330 100644 --- a/lib/src/settings/settings_chat.dart +++ b/lib/src/settings/settings_chat.dart @@ -44,6 +44,7 @@ import 'package:delta_chat_core/delta_chat_core.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; import 'package:ox_coi/src/l10n/l.dart'; import 'package:ox_coi/src/l10n/l10n.dart'; import 'package:ox_coi/src/navigation/navigatable.dart'; @@ -91,7 +92,11 @@ class _SettingsChatState extends State { contentPadding: EdgeInsets.symmetric(vertical: listItemPadding, horizontal: listItemPadding), title: Text(L10n.get(L.settingReadReceiptP, count: L10n.plural)), subtitle: Text(L10n.get(L.settingReadReceiptText)), - trailing: Switch.adaptive(value: state.readReceiptsEnabled, onChanged: (value) => _changeReadReceipts()), + trailing: Switch.adaptive( + value: state.readReceiptsEnabled, + onChanged: (value) => _changeReadReceipts(), + activeColor: CustomTheme.of(context).accent, + ), ), ListTile( contentPadding: EdgeInsets.symmetric(vertical: listItemPadding, horizontal: listItemPadding), @@ -130,18 +135,21 @@ class _SettingsChatState extends State { value: Context.showEmailsOff, groupValue: inviteSetting, onChanged: _onMessageSyncChooserTab, + activeColor: CustomTheme.of(context).accent, ), RadioListTile( title: Text(L10n.get(L.settingMessageSyncingTypeKnown)), value: Context.showEmailsAcceptedContacts, groupValue: inviteSetting, onChanged: _onMessageSyncChooserTab, + activeColor: CustomTheme.of(context).accent, ), RadioListTile( title: Text(L10n.get(L.settingMessageSyncingTypeAll)), value: Context.showEmailsAll, groupValue: inviteSetting, onChanged: _onMessageSyncChooserTab, + activeColor: CustomTheme.of(context).accent, ), ], ); diff --git a/lib/src/settings/settings_notifications.dart b/lib/src/settings/settings_notifications.dart index fe574d59..411ba575 100644 --- a/lib/src/settings/settings_notifications.dart +++ b/lib/src/settings/settings_notifications.dart @@ -45,17 +45,17 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ox_coi/src/brandable/brandable_icon.dart'; +import 'package:ox_coi/src/brandable/custom_theme.dart'; import 'package:ox_coi/src/l10n/l.dart'; import 'package:ox_coi/src/l10n/l10n.dart'; import 'package:ox_coi/src/navigation/navigatable.dart'; import 'package:ox_coi/src/navigation/navigation.dart'; +import 'package:ox_coi/src/settings/settings_notifications_bloc.dart'; import 'package:ox_coi/src/settings/settings_notifications_event_state.dart'; import 'package:ox_coi/src/ui/dimensions.dart'; import 'package:ox_coi/src/widgets/dynamic_appbar.dart'; import 'package:ox_coi/src/widgets/state_info.dart'; -import 'settings_notifications_bloc.dart'; - class SettingsNotifications extends StatefulWidget { @override _SettingsNotificationsState createState() => _SettingsNotificationsState(); @@ -97,7 +97,11 @@ class _SettingsNotificationsState extends State { contentPadding: const EdgeInsets.symmetric(vertical: listItemPadding, horizontal: listItemPadding), title: Text(L10n.get(L.settingNotificationPull)), subtitle: Text(L10n.get(L.settingNotificationPullText)), - trailing: Switch.adaptive(value: state.pullActive, onChanged: (value) => _changeNotificationsSetting()), + trailing: Switch.adaptive( + value: state.pullActive, + onChanged: (value) => _changeNotificationsSetting(), + activeColor: CustomTheme.of(context).accent, + ), ), ), Visibility( diff --git a/lib/src/settings/settings_notifications_bloc.dart b/lib/src/settings/settings_notifications_bloc.dart index 93454eae..7f6285db 100644 --- a/lib/src/settings/settings_notifications_bloc.dart +++ b/lib/src/settings/settings_notifications_bloc.dart @@ -44,8 +44,7 @@ import 'package:bloc/bloc.dart'; import 'package:delta_chat_core/delta_chat_core.dart'; import 'package:ox_coi/src/background_refresh/background_refresh_manager.dart'; import 'package:ox_coi/src/platform/preferences.dart'; - -import 'settings_notifications_event_state.dart'; +import 'package:ox_coi/src/settings/settings_notifications_event_state.dart'; class SettingsNotificationsBloc extends Bloc { @override diff --git a/lib/src/ui/text_styles.dart b/lib/src/ui/text_styles.dart index 3100fb93..a65a119f 100644 --- a/lib/src/ui/text_styles.dart +++ b/lib/src/ui/text_styles.dart @@ -45,18 +45,18 @@ import 'package:flutter/material.dart'; import '../brandable/custom_theme.dart'; import '../extensions/color_apis.dart'; -getAccentW500TextStyle(BuildContext context){ +getAccentW500TextStyle(BuildContext context) { return TextStyle(color: CustomTheme.of(context).accent, fontWeight: FontWeight.w500); } -getProfileHeaderTextStyle(BuildContext context){ +getProfileHeaderTextStyle(BuildContext context) { return Theme.of(context).textTheme.body1.apply(color: CustomTheme.of(context).onSurface); } -getProfileHeaderSecondTextStyle(BuildContext context){ +getProfileHeaderSecondTextStyle(BuildContext context) { return Theme.of(context).textTheme.caption.apply(color: CustomTheme.of(context).onSurface.fade()); } -getProfileHeaderPlaceholderTextStyle(BuildContext context){ +getProfileHeaderPlaceholderTextStyle(BuildContext context) { return Theme.of(context).textTheme.body1.apply(color: CustomTheme.of(context).onSurface.disabled()); } diff --git a/lib/src/user/user_profile.dart b/lib/src/user/user_profile.dart index fa56770c..c69b5736 100644 --- a/lib/src/user/user_profile.dart +++ b/lib/src/user/user_profile.dart @@ -62,6 +62,7 @@ import 'package:ox_coi/src/navigation/navigation.dart'; import 'package:ox_coi/src/platform/app_information.dart'; import 'package:ox_coi/src/platform/preferences.dart'; import 'package:ox_coi/src/qr/qr.dart'; +import 'package:ox_coi/src/settings/settings_appearance.dart'; import 'package:ox_coi/src/settings/settings_signature.dart'; import 'package:ox_coi/src/user/user_bloc.dart'; import 'package:ox_coi/src/user/user_change_bloc.dart'; @@ -189,13 +190,11 @@ class _ProfileState extends State { text: L10n.get(L.settingGroupHeaderGeneralTitle), ), SettingsItem( - icon: IconSource.darkMode, - text: L10n.get(L.settingItemDarkModeTitle), - iconBackground: CustomTheme.of(context).darkModeIcon, - onTap: () => _changeTheme(), - showSwitch: true, - onSwitchChanged: () => _changeTheme(), - key: Key(keyUserProfileDarkModeIconSource), + icon: IconSource.appearance, + text: SettingsAppearance.viewTitle, + iconBackground: CustomTheme.of(context).appearanceIcon, + onTap: () => _settingsItemTapped(context, SettingsItemName.appearance), + key: Key(keyUserProfileAppearanceIconSource), ), SettingsItem( icon: IconSource.notifications, @@ -319,6 +318,9 @@ class _ProfileState extends State { case SettingsItemName.invite: _createInviteUrl(); break; + case SettingsItemName.appearance: + navigation.pushNamed(context, Navigation.settingsAppearance); + break; case SettingsItemName.notification: navigation.pushNamed(context, Navigation.settingsNotifications); break; @@ -381,13 +383,6 @@ class _ProfileState extends State { mainBloc.add(Logout()); } - void _changeTheme() async { - ThemeKey actualKey = CustomTheme.instanceOf(context).actualThemeKey; - var newTheme = actualKey == ThemeKey.DARK ? ThemeKey.LIGHT : ThemeKey.DARK; - await setPreference(preferenceAppThemeKey, newTheme.toString()); - CustomTheme.instanceOf(context).changeTheme(newTheme); - } - void _editPhotoCallback(String avatarPath) { setState(() { _avatarPath = avatarPath; diff --git a/lib/src/utils/keyMapping.dart b/lib/src/utils/keyMapping.dart index 29d44894..b09dc820 100644 --- a/lib/src/utils/keyMapping.dart +++ b/lib/src/utils/keyMapping.dart @@ -85,6 +85,7 @@ const keyUserProfileBlockIconButton = "keyContactListBlockIconButton"; const keyUserProfileBlockIconSource = "keyUserProfilBlockIconSource"; const keyUserProfileNotificationIconSource = "keyProfileNotificationIconSource"; const keyUserProfileDarkModeIconSource = "keyProfileDarkModeIconSource"; +const keyUserProfileAppearanceIconSource = "keyProfileAppearanceIconSource"; const keyUserProfileServerSettingIconSource = "keyUserProfileServerSettingIconSource"; const keyContactDetailOpenChatProfileActionIcon = "keyContactDetailOpenChatProfileActionIcon"; diff --git a/lib/src/utils/vibration.dart b/lib/src/utils/vibration.dart index 6473591d..96614df4 100644 --- a/lib/src/utils/vibration.dart +++ b/lib/src/utils/vibration.dart @@ -42,4 +42,6 @@ import 'package:vibrate/vibrate.dart'; -vibrateMedium ()=> Vibrate.feedback(FeedbackType.medium); \ No newline at end of file +void vibrateLight() => Vibrate.feedback(FeedbackType.light); + +void vibrateMedium() => Vibrate.feedback(FeedbackType.medium); diff --git a/lib/src/widgets/settings_item.dart b/lib/src/widgets/settings_item.dart index 118c8188..903c2e58 100644 --- a/lib/src/widgets/settings_item.dart +++ b/lib/src/widgets/settings_item.dart @@ -53,6 +53,7 @@ enum SettingsItemName { flagged, qrShow, invite, + appearance, notification, chat, signature,