diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index b68ea546..b92b50e6 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -325,6 +325,7 @@ "settingsAprilFoolFeatures": "April Fool Features", "settingsEnterToSend": "Enter to Send", "settingsTransparentAppBar": "Transparent App Bar", + "settingsCardBackgroundOpacity": "Card Background Opacity", "settingsCustomFonts": "Custom Fonts", "settingsCustomFontsHint": "Custom fonts will be used for all text in the app. Make sure it is installed on your device.", "settingsColorScheme": "Color Scheme", diff --git a/lib/pods/config.dart b/lib/pods/config.dart index 09960cde..68dced96 100644 --- a/lib/pods/config.dart +++ b/lib/pods/config.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:island/pods/theme.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:window_manager/window_manager.dart'; @@ -26,10 +25,12 @@ const kAppSoundEffects = 'app_sound_effects'; const kAppAprilFoolFeatures = 'app_april_fool_features'; const kAppWindowSize = 'app_window_size'; const kAppWindowOpacity = 'app_window_opacity'; +const kAppCardTransparent = 'app_card_transparent'; const kAppEnterToSend = 'app_enter_to_send'; const kAppDefaultPoolId = 'app_default_pool_id'; const kAppMessageDisplayStyle = 'app_message_display_style'; const kAppThemeMode = 'app_theme_mode'; +const kMaterialYouToggleStoreKey = 'app_theme_material_you'; const kFeaturedPostsCollapsedId = 'featured_posts_collapsed_id'; // Key for storing the ID of the collapsed featured post @@ -71,9 +72,11 @@ sealed class AppSettings with _$AppSettings { required int? appColorScheme, // The color stored via the int type required Size? windowSize, // The window size for desktop platforms required double windowOpacity, // The window opacity for desktop platforms + required double cardTransparency, // The card background opacity required String? defaultPoolId, required String messageDisplayStyle, required String? themeMode, + required bool useMaterial3, }) = _AppSettings; } @@ -94,9 +97,11 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { appColorScheme: prefs.getInt(kAppColorSchemeStoreKey), windowSize: _getWindowSizeFromPrefs(prefs), windowOpacity: prefs.getDouble(kAppWindowOpacity) ?? 1.0, + cardTransparency: prefs.getDouble(kAppCardTransparent) ?? 1.0, defaultPoolId: prefs.getString(kAppDefaultPoolId), messageDisplayStyle: prefs.getString(kAppMessageDisplayStyle) ?? 'bubble', themeMode: prefs.getString(kAppThemeMode) ?? 'system', + useMaterial3: prefs.getBool(kMaterialYouToggleStoreKey) ?? true, ); } @@ -161,7 +166,6 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { final prefs = ref.read(sharedPreferencesProvider); prefs.setBool(kAppbarTransparentStoreKey, value); state = state.copyWith(appBarTransparent: value); - ref.read(themeProvider.notifier).reloadTheme(); } void setShowBackgroundImage(bool value) { @@ -174,14 +178,12 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { final prefs = ref.read(sharedPreferencesProvider); prefs.setString(kAppCustomFonts, value ?? ''); state = state.copyWith(customFonts: value); - ref.read(themeProvider.notifier).reloadTheme(); } void setAppColorScheme(int? value) { final prefs = ref.read(sharedPreferencesProvider); prefs.setInt(kAppColorSchemeStoreKey, value ?? 0); state = state.copyWith(appColorScheme: value); - ref.read(themeProvider.notifier).reloadTheme(); } void setWindowSize(Size? size) { @@ -216,6 +218,18 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { prefs.setString(kAppThemeMode, value); state = state.copyWith(themeMode: value); } + + void setAppTransparentBackground(double value) { + final prefs = ref.read(sharedPreferencesProvider); + prefs.setDouble(kAppCardTransparent, value); + state = state.copyWith(cardTransparency: value); + } + + void setUseMaterial3(bool value) { + final prefs = ref.read(sharedPreferencesProvider); + prefs.setBool(kMaterialYouToggleStoreKey, value); + state = state.copyWith(useMaterial3: value); + } } final updateInfoProvider = diff --git a/lib/pods/config.freezed.dart b/lib/pods/config.freezed.dart index 7f8a99d6..7c0c30e6 100644 --- a/lib/pods/config.freezed.dart +++ b/lib/pods/config.freezed.dart @@ -17,7 +17,8 @@ mixin _$AppSettings { bool get autoTranslate; bool get dataSavingMode; bool get soundEffects; bool get aprilFoolFeatures; bool get enterToSend; bool get appBarTransparent; bool get showBackgroundImage; String? get customFonts; int? get appColorScheme;// The color stored via the int type Size? get windowSize;// The window size for desktop platforms double get windowOpacity;// The window opacity for desktop platforms - String? get defaultPoolId; String get messageDisplayStyle; String? get themeMode; + double get cardTransparency;// The card background opacity + String? get defaultPoolId; String get messageDisplayStyle; String? get themeMode; bool get useMaterial3; /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -28,16 +29,16 @@ $AppSettingsCopyWith get copyWith => _$AppSettingsCopyWithImpl Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,windowOpacity,defaultPoolId,messageDisplayStyle,themeMode); +int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3); @override String toString() { - return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, windowOpacity: $windowOpacity, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode)'; + return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3)'; } @@ -48,7 +49,7 @@ abstract mixin class $AppSettingsCopyWith<$Res> { factory $AppSettingsCopyWith(AppSettings value, $Res Function(AppSettings) _then) = _$AppSettingsCopyWithImpl; @useResult $Res call({ - bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, String? defaultPoolId, String messageDisplayStyle, String? themeMode + bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3 }); @@ -65,7 +66,7 @@ class _$AppSettingsCopyWithImpl<$Res> /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,}) { return _then(_self.copyWith( autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable @@ -78,10 +79,12 @@ as bool,customFonts: freezed == customFonts ? _self.customFonts : customFonts // as String?,appColorScheme: freezed == appColorScheme ? _self.appColorScheme : appColorScheme // ignore: cast_nullable_to_non_nullable as int?,windowSize: freezed == windowSize ? _self.windowSize : windowSize // ignore: cast_nullable_to_non_nullable as Size?,windowOpacity: null == windowOpacity ? _self.windowOpacity : windowOpacity // ignore: cast_nullable_to_non_nullable +as double,cardTransparency: null == cardTransparency ? _self.cardTransparency : cardTransparency // ignore: cast_nullable_to_non_nullable as double,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaultPoolId // ignore: cast_nullable_to_non_nullable as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable -as String?, +as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable +as bool, )); } @@ -163,10 +166,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, String? defaultPoolId, String messageDisplayStyle, String? themeMode)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _AppSettings() when $default != null: -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode);case _: +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);case _: return orElse(); } @@ -184,10 +187,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, String? defaultPoolId, String messageDisplayStyle, String? themeMode) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3) $default,) {final _that = this; switch (_that) { case _AppSettings(): -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode);} +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);} } /// A variant of `when` that fallback to returning `null` /// @@ -201,10 +204,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, String? defaultPoolId, String messageDisplayStyle, String? themeMode)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3)? $default,) {final _that = this; switch (_that) { case _AppSettings() when $default != null: -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode);case _: +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);case _: return null; } @@ -216,7 +219,7 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha class _AppSettings implements AppSettings { - const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.windowSize, required this.windowOpacity, required this.defaultPoolId, required this.messageDisplayStyle, required this.themeMode}); + const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.windowSize, required this.windowOpacity, required this.cardTransparency, required this.defaultPoolId, required this.messageDisplayStyle, required this.themeMode, required this.useMaterial3}); @override final bool autoTranslate; @@ -233,9 +236,12 @@ class _AppSettings implements AppSettings { // The window size for desktop platforms @override final double windowOpacity; // The window opacity for desktop platforms +@override final double cardTransparency; +// The card background opacity @override final String? defaultPoolId; @override final String messageDisplayStyle; @override final String? themeMode; +@override final bool useMaterial3; /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. @@ -247,16 +253,16 @@ _$AppSettingsCopyWith<_AppSettings> get copyWith => __$AppSettingsCopyWithImpl<_ @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.cardTransparency, cardTransparency) || other.cardTransparency == cardTransparency)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)&&(identical(other.useMaterial3, useMaterial3) || other.useMaterial3 == useMaterial3)); } @override -int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,windowOpacity,defaultPoolId,messageDisplayStyle,themeMode); +int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3); @override String toString() { - return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, windowOpacity: $windowOpacity, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode)'; + return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3)'; } @@ -267,7 +273,7 @@ abstract mixin class _$AppSettingsCopyWith<$Res> implements $AppSettingsCopyWith factory _$AppSettingsCopyWith(_AppSettings value, $Res Function(_AppSettings) _then) = __$AppSettingsCopyWithImpl; @override @useResult $Res call({ - bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, String? defaultPoolId, String messageDisplayStyle, String? themeMode + bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3 }); @@ -284,7 +290,7 @@ class __$AppSettingsCopyWithImpl<$Res> /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,}) { return _then(_AppSettings( autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable @@ -297,10 +303,12 @@ as bool,customFonts: freezed == customFonts ? _self.customFonts : customFonts // as String?,appColorScheme: freezed == appColorScheme ? _self.appColorScheme : appColorScheme // ignore: cast_nullable_to_non_nullable as int?,windowSize: freezed == windowSize ? _self.windowSize : windowSize // ignore: cast_nullable_to_non_nullable as Size?,windowOpacity: null == windowOpacity ? _self.windowOpacity : windowOpacity // ignore: cast_nullable_to_non_nullable +as double,cardTransparency: null == cardTransparency ? _self.cardTransparency : cardTransparency // ignore: cast_nullable_to_non_nullable as double,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaultPoolId // ignore: cast_nullable_to_non_nullable as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable -as String?, +as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable +as bool, )); } diff --git a/lib/pods/config.g.dart b/lib/pods/config.g.dart index 91faebb3..704abe48 100644 --- a/lib/pods/config.g.dart +++ b/lib/pods/config.g.dart @@ -7,7 +7,7 @@ part of 'config.dart'; // ************************************************************************** String _$appSettingsNotifierHash() => - r'c3042f77067b5f36102f17277e174a756121ac74'; + r'514c771a398f4647a22b2d51ae0152bff713833f'; /// See also [AppSettingsNotifier]. @ProviderFor(AppSettingsNotifier) diff --git a/lib/pods/theme.dart b/lib/pods/theme.dart index f6fceec6..5497a3f3 100644 --- a/lib/pods/theme.dart +++ b/lib/pods/theme.dart @@ -1,38 +1,16 @@ import 'package:flutter/material.dart'; import 'package:island/pods/config.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; -final themeProvider = StateNotifierProvider((ref) { - return ThemeNotifier(); -}); +part 'theme.g.dart'; -class ThemeNotifier extends StateNotifier { - ThemeNotifier() : super(null) { - _loadTheme(); - } - - Future _loadTheme() async { - final theme = await createAppThemeSet(); - state = theme; - } - - void reloadTheme({ - Color? seedColorOverride, - bool? useMaterial3, - String? customFonts, - }) async { - final theme = await createAppThemeSet( - seedColorOverride: seedColorOverride, - useMaterial3: useMaterial3, - customFonts: customFonts, - ); - state = theme; - } +@riverpod +ThemeSet theme(Ref ref) { + final settings = ref.watch(appSettingsNotifierProvider); + return createAppThemeSet(settings); } -const kMaterialYouToggleStoreKey = 'app_theme_material_you'; - class ThemeSet { ThemeData light; ThemeData dark; @@ -40,52 +18,29 @@ class ThemeSet { ThemeSet({required this.light, required this.dark}); } -Future createAppThemeSet({ - Color? seedColorOverride, - bool? useMaterial3, - String? customFonts, -}) async { +ThemeSet createAppThemeSet(AppSettings settings) { return ThemeSet( - light: await createAppTheme( - Brightness.light, - useMaterial3: useMaterial3, - customFonts: customFonts, - ), - dark: await createAppTheme( - Brightness.dark, - useMaterial3: useMaterial3, - customFonts: customFonts, - ), + light: createAppTheme(Brightness.light, settings), + dark: createAppTheme(Brightness.dark, settings), ); } -Future createAppTheme( - Brightness brightness, { - Color? seedColorOverride, - bool? useMaterial3, - String? customFonts, -}) async { - final prefs = await SharedPreferences.getInstance(); - - final seedColorString = prefs.getInt(kAppColorSchemeStoreKey); +ThemeData createAppTheme(Brightness brightness, AppSettings settings) { final seedColor = - seedColorString != null ? Color(seedColorString) : Colors.indigo; + settings.appColorScheme != null + ? Color(settings.appColorScheme!) + : Colors.indigo; final colorScheme = ColorScheme.fromSeed( - seedColor: seedColorOverride ?? seedColor, + seedColor: seedColor, brightness: brightness, ); - final hasAppBarTransparent = - prefs.getBool(kAppbarTransparentStoreKey) ?? false; - final useM3 = - useMaterial3 ?? (prefs.getBool(kMaterialYouToggleStoreKey) ?? true); + final hasAppBarTransparent = settings.appBarTransparent; + final useM3 = settings.useMaterial3; final inUseFonts = - (customFonts ?? prefs.getString(kAppCustomFonts)) - ?.split(',') - .map((ele) => ele.trim()) - .toList() ?? + settings.customFonts?.split(',').map((ele) => ele.trim()).toList() ?? ['Nunito']; return ThemeData( @@ -108,6 +63,11 @@ Future createAppTheme( foregroundColor: hasAppBarTransparent ? colorScheme.onSurface : colorScheme.onPrimary, ), + cardTheme: CardThemeData( + color: colorScheme.surfaceContainer.withOpacity( + settings.cardTransparency, + ), + ), pageTransitionsTheme: PageTransitionsTheme( builders: { TargetPlatform.android: ZoomPageTransitionsBuilder(), diff --git a/lib/pods/theme.g.dart b/lib/pods/theme.g.dart new file mode 100644 index 00000000..f8b3ac85 --- /dev/null +++ b/lib/pods/theme.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'theme.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$themeHash() => r'a12dbf8b83d75713b7ae4c68e9cdd1a1cc3a35f0'; + +/// See also [theme]. +@ProviderFor(theme) +final themeProvider = AutoDisposeProvider.internal( + theme, + name: r'themeProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$themeHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef ThemeRef = AutoDisposeProviderRef; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index f068535f..8c1c5757 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -299,6 +299,30 @@ class SettingsScreen extends HookConsumerWidget { ), ), + // Card background opacity settings + ListTile( + minLeadingWidth: 48, + title: Text('settingsCardBackgroundOpacity').tr(), + contentPadding: const EdgeInsets.only(left: 24, right: 17), + leading: const Icon(Symbols.opacity), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8), + child: Slider( + value: settings.cardTransparency, + min: 0.0, + max: 1.0, + year2023: true, + padding: EdgeInsets.only(right: 24), + label: '${(settings.cardTransparency * 100).round()}%', + onChanged: (value) { + ref + .read(appSettingsNotifierProvider.notifier) + .setAppTransparentBackground(value); + }, + ), + ), + ), + // Background image settings (only for non-web platforms) if (!kIsWeb && docBasepath.value != null) ListTile(