EnumProviders -> UserPreferencesProvider

This commit is contained in:
Vadim 2023-08-13 20:57:46 +02:00
parent e79226cfed
commit 9822d2541b
11 changed files with 47 additions and 45 deletions

View file

@ -5,7 +5,7 @@ import 'package:lightmeter/data/models/supported_locale.dart';
import 'package:lightmeter/environment.dart'; import 'package:lightmeter/environment.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers.dart'; import 'package:lightmeter/providers.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/res/theme.dart'; import 'package:lightmeter/res/theme.dart';
import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:lightmeter/screens/metering/flow_metering.dart';
import 'package:lightmeter/screens/settings/flow_settings.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart';
@ -22,8 +22,8 @@ class Application extends StatelessWidget {
builder: (context, ready) { builder: (context, ready) {
if (ready) { if (ready) {
final theme = themeFrom( final theme = themeFrom(
EnumProviders.primaryColorOf(context), UserPreferencesProvider.primaryColorOf(context),
EnumProviders.brightnessOf(context), UserPreferencesProvider.brightnessOf(context),
); );
final systemIconsBrightness = final systemIconsBrightness =
ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface);
@ -38,7 +38,7 @@ class Application extends StatelessWidget {
), ),
child: MaterialApp( child: MaterialApp(
theme: theme, theme: theme,
locale: Locale(EnumProviders.localeOf(context).intlName), locale: Locale(UserPreferencesProvider.localeOf(context).intlName),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,

View file

@ -6,7 +6,7 @@ import 'package:lightmeter/data/permissions_service.dart';
import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart';
import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/data/volume_events_service.dart';
import 'package:lightmeter/environment.dart'; import 'package:lightmeter/environment.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart';
import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
import 'package:lightmeter/providers/service_providers.dart'; import 'package:lightmeter/providers/service_providers.dart';
@ -36,7 +36,7 @@ class LightmeterProviders extends StatelessWidget {
permissionsService: const PermissionsService(), permissionsService: const PermissionsService(),
userPreferencesService: UserPreferencesService(snapshot.data![0] as SharedPreferences), userPreferencesService: UserPreferencesService(snapshot.data![0] as SharedPreferences),
volumeEventsService: const VolumeEventsService(LocalPlatform()), volumeEventsService: const VolumeEventsService(LocalPlatform()),
child: EnumProviders( child: UserPreferencesProvider(
child: MeteringScreenLayoutProvider( child: MeteringScreenLayoutProvider(
child: EquipmentProfileProvider( child: EquipmentProfileProvider(
child: Builder( child: Builder(

View file

@ -20,13 +20,13 @@ enum _ListenableAspect {
themeType, themeType,
} }
class EnumProviders extends StatefulWidget { class UserPreferencesProvider extends StatefulWidget {
final Widget child; final Widget child;
const EnumProviders({required this.child, super.key}); const UserPreferencesProvider({required this.child, super.key});
static _EnumProvidersState of(BuildContext context) { static _UserPreferencesProviderState of(BuildContext context) {
return context.findAncestorStateOfType<_EnumProvidersState>()!; return context.findAncestorStateOfType<_UserPreferencesProviderState>()!;
} }
static Brightness brightnessOf(BuildContext context) { static Brightness brightnessOf(BuildContext context) {
@ -57,15 +57,17 @@ class EnumProviders extends StatefulWidget {
return _inheritFrom(context, _ListenableAspect.themeType).themeType; return _inheritFrom(context, _ListenableAspect.themeType).themeType;
} }
static _EnumProvidersModel _inheritFrom(BuildContext context, _ListenableAspect aspect) { static _UserPreferencesProviderModel _inheritFrom(
return InheritedModel.inheritFrom<_EnumProvidersModel>(context, aspect: aspect)!; BuildContext context, _ListenableAspect aspect) {
return InheritedModel.inheritFrom<_UserPreferencesProviderModel>(context, aspect: aspect)!;
} }
@override @override
State<EnumProviders> createState() => _EnumProvidersState(); State<UserPreferencesProvider> createState() => _UserPreferencesProviderState();
} }
class _EnumProvidersState extends State<EnumProviders> with WidgetsBindingObserver { class _UserPreferencesProviderState extends State<UserPreferencesProvider>
with WidgetsBindingObserver {
UserPreferencesService get userPreferencesService => UserPreferencesService get userPreferencesService =>
ServiceProviders.userPreferencesServiceOf(context); ServiceProviders.userPreferencesServiceOf(context);
@ -118,7 +120,7 @@ class _EnumProvidersState extends State<EnumProviders> with WidgetsBindingObserv
dynamicPrimaryColor = null; dynamicPrimaryColor = null;
state = DynamicColorState.unavailable; state = DynamicColorState.unavailable;
} }
return _EnumProvidersModel( return _UserPreferencesProviderModel(
brightness: _themeBrightness, brightness: _themeBrightness,
dynamicColorState: state, dynamicColorState: state,
evSourceType: evSourceType, evSourceType: evSourceType,
@ -196,7 +198,7 @@ class _EnumProvidersState extends State<EnumProviders> with WidgetsBindingObserv
} }
} }
class _EnumProvidersModel extends InheritedModel<_ListenableAspect> { class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> {
final Brightness brightness; final Brightness brightness;
final DynamicColorState dynamicColorState; final DynamicColorState dynamicColorState;
final EvSourceType evSourceType; final EvSourceType evSourceType;
@ -205,7 +207,7 @@ class _EnumProvidersModel extends InheritedModel<_ListenableAspect> {
final StopType stopType; final StopType stopType;
final ThemeType themeType; final ThemeType themeType;
const _EnumProvidersModel({ const _UserPreferencesProviderModel({
required this.brightness, required this.brightness,
required this.dynamicColorState, required this.dynamicColorState,
required this.evSourceType, required this.evSourceType,
@ -217,7 +219,7 @@ class _EnumProvidersModel extends InheritedModel<_ListenableAspect> {
}); });
@override @override
bool updateShouldNotify(_EnumProvidersModel oldWidget) { bool updateShouldNotify(_UserPreferencesProviderModel oldWidget) {
return brightness != oldWidget.brightness || return brightness != oldWidget.brightness ||
dynamicColorState != oldWidget.dynamicColorState || dynamicColorState != oldWidget.dynamicColorState ||
evSourceType != oldWidget.evSourceType || evSourceType != oldWidget.evSourceType ||
@ -229,7 +231,7 @@ class _EnumProvidersModel extends InheritedModel<_ListenableAspect> {
@override @override
bool updateShouldNotifyDependent( bool updateShouldNotifyDependent(
_EnumProvidersModel oldWidget, _UserPreferencesProviderModel oldWidget,
Set<_ListenableAspect> dependencies, Set<_ListenableAspect> dependencies,
) { ) {
return (brightness != oldWidget.brightness && return (brightness != oldWidget.brightness &&

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/ev_source_type.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/dimens.dart';
import 'package:lightmeter/screens/metering/components/bottom_controls/components/measure_button/widget_button_measure.dart'; import 'package:lightmeter/screens/metering/components/bottom_controls/components/measure_button/widget_button_measure.dart';
@ -42,7 +42,7 @@ class MeteringBottomControls extends StatelessWidget {
child: IconButton( child: IconButton(
onPressed: onSwitchEvSourceType, onPressed: onSwitchEvSourceType,
icon: Icon( icon: Icon(
EnumProviders.evSourceTypeOf(context) != EvSourceType.camera UserPreferencesProvider.evSourceTypeOf(context) != EvSourceType.camera
? Icons.camera_rear ? Icons.camera_rear
: Icons.wb_incandescent, : Icons.wb_incandescent,
), ),

View file

@ -6,7 +6,7 @@ import 'package:lightmeter/data/models/ev_source_type.dart';
import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/exposure_pair.dart';
import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/film.dart';
import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/providers/service_providers.dart'; import 'package:lightmeter/providers/service_providers.dart';
import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart';
import 'package:lightmeter/screens/metering/components/bottom_controls/provider_bottom_controls.dart'; import 'package:lightmeter/screens/metering/components/bottom_controls/provider_bottom_controls.dart';
@ -46,7 +46,7 @@ class MeteringScreen extends StatelessWidget {
ev: state is MeteringDataState ? state.ev : null, ev: state is MeteringDataState ? state.ev : null,
isMetering: state.isMetering, isMetering: state.isMetering,
onSwitchEvSourceType: ServiceProviders.environmentOf(context).hasLightSensor onSwitchEvSourceType: ServiceProviders.environmentOf(context).hasLightSensor
? EnumProviders.of(context).toggleEvSourceType ? UserPreferencesProvider.of(context).toggleEvSourceType
: null, : null,
onMeasure: () => context.read<MeteringBloc>().add(const MeasureEvent()), onMeasure: () => context.read<MeteringBloc>().add(const MeasureEvent()),
onSettings: () { onSettings: () {
@ -111,7 +111,7 @@ class _MeteringContainerBuidler extends StatelessWidget {
final fastest = exposurePairs.isNotEmpty ? exposurePairs.first : null; final fastest = exposurePairs.isNotEmpty ? exposurePairs.first : null;
final slowest = exposurePairs.isNotEmpty ? exposurePairs.last : null; final slowest = exposurePairs.isNotEmpty ? exposurePairs.last : null;
// Doubled build here when switching evSourceType. As new source bloc fires a new state on init // Doubled build here when switching evSourceType. As new source bloc fires a new state on init
return EnumProviders.evSourceTypeOf(context) == EvSourceType.camera return UserPreferencesProvider.evSourceTypeOf(context) == EvSourceType.camera
? CameraContainerProvider( ? CameraContainerProvider(
fastest: fastest, fastest: fastest,
slowest: slowest, slowest: slowest,
@ -142,7 +142,7 @@ class _MeteringContainerBuidler extends StatelessWidget {
} }
/// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3 /// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3
final StopType stopType = EnumProviders.stopTypeOf(context); final StopType stopType = UserPreferencesProvider.stopTypeOf(context);
final int evSteps = (ev * (stopType.index + 1)).round(); final int evSteps = (ev * (stopType.index + 1)).round();
final EquipmentProfile equipmentProfile = context.listen<EquipmentProfile>(); final EquipmentProfile equipmentProfile = context.listen<EquipmentProfile>();

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/supported_locale.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart'; import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart';
class LanguageListTile extends StatelessWidget { class LanguageListTile extends StatelessWidget {
@ -12,20 +12,20 @@ class LanguageListTile extends StatelessWidget {
return ListTile( return ListTile(
leading: const Icon(Icons.language), leading: const Icon(Icons.language),
title: Text(S.of(context).language), title: Text(S.of(context).language),
trailing: Text(EnumProviders.localeOf(context).localizedName), trailing: Text(UserPreferencesProvider.localeOf(context).localizedName),
onTap: () { onTap: () {
showDialog<SupportedLocale>( showDialog<SupportedLocale>(
context: context, context: context,
builder: (_) => DialogPicker<SupportedLocale>( builder: (_) => DialogPicker<SupportedLocale>(
icon: Icons.language, icon: Icons.language,
title: S.of(context).chooseLanguage, title: S.of(context).chooseLanguage,
selectedValue: EnumProviders.localeOf(context), selectedValue: UserPreferencesProvider.localeOf(context),
values: SupportedLocale.values, values: SupportedLocale.values,
titleAdapter: (context, value) => value.localizedName, titleAdapter: (context, value) => value.localizedName,
), ),
).then((value) { ).then((value) {
if (value != null) { if (value != null) {
EnumProviders.of(context).setLocale(value); UserPreferencesProvider.of(context).setLocale(value);
} }
}); });
}, },

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart'; import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
@ -12,20 +12,20 @@ class StopTypeListTile extends StatelessWidget {
return ListTile( return ListTile(
leading: const Icon(Icons.straighten), leading: const Icon(Icons.straighten),
title: Text(S.of(context).fractionalStops), title: Text(S.of(context).fractionalStops),
trailing: Text(_typeToString(context, EnumProviders.stopTypeOf(context))), trailing: Text(_typeToString(context, UserPreferencesProvider.stopTypeOf(context))),
onTap: () { onTap: () {
showDialog<StopType>( showDialog<StopType>(
context: context, context: context,
builder: (_) => DialogPicker<StopType>( builder: (_) => DialogPicker<StopType>(
icon: Icons.straighten, icon: Icons.straighten,
title: S.of(context).showFractionalStops, title: S.of(context).showFractionalStops,
selectedValue: EnumProviders.stopTypeOf(context), selectedValue: UserPreferencesProvider.stopTypeOf(context),
values: StopType.values, values: StopType.values,
titleAdapter: _typeToString, titleAdapter: _typeToString,
), ),
).then((value) { ).then((value) {
if (value != null) { if (value != null) {
EnumProviders.of(context).setStopType(value); UserPreferencesProvider.of(context).setStopType(value);
} }
}); });
}, },

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/dimens.dart';
class DynamicColorListTile extends StatelessWidget { class DynamicColorListTile extends StatelessWidget {
@ -12,8 +12,8 @@ class DynamicColorListTile extends StatelessWidget {
return SwitchListTile( return SwitchListTile(
secondary: const Icon(Icons.colorize), secondary: const Icon(Icons.colorize),
title: Text(S.of(context).dynamicColor), title: Text(S.of(context).dynamicColor),
value: EnumProviders.dynamicColorStateOf(context) == DynamicColorState.enabled, value: UserPreferencesProvider.dynamicColorStateOf(context) == DynamicColorState.enabled,
onChanged: EnumProviders.of(context).enableDynamicColor, onChanged: UserPreferencesProvider.of(context).enableDynamicColor,
contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM),
); );
} }

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/dimens.dart';
import 'package:lightmeter/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart'; import 'package:lightmeter/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart';
@ -10,7 +10,7 @@ class PrimaryColorListTile extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (EnumProviders.dynamicColorStateOf(context) == DynamicColorState.enabled) { if (UserPreferencesProvider.dynamicColorStateOf(context) == DynamicColorState.enabled) {
return Opacity( return Opacity(
opacity: Dimens.disabledOpacity, opacity: Dimens.disabledOpacity,
child: IgnorePointer( child: IgnorePointer(
@ -30,7 +30,7 @@ class PrimaryColorListTile extends StatelessWidget {
builder: (_) => const PrimaryColorDialogPicker(), builder: (_) => const PrimaryColorDialogPicker(),
).then((value) { ).then((value) {
if (value != null) { if (value != null) {
EnumProviders.of(context).setPrimaryColor(value); UserPreferencesProvider.of(context).setPrimaryColor(value);
} }
}); });
}, },

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/data/models/theme_type.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart'; import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart';
class ThemeTypeListTile extends StatelessWidget { class ThemeTypeListTile extends StatelessWidget {
@ -12,20 +12,20 @@ class ThemeTypeListTile extends StatelessWidget {
return ListTile( return ListTile(
leading: const Icon(Icons.brightness_6), leading: const Icon(Icons.brightness_6),
title: Text(S.of(context).theme), title: Text(S.of(context).theme),
trailing: Text(_typeToString(context, EnumProviders.themeTypeOf(context))), trailing: Text(_typeToString(context, UserPreferencesProvider.themeTypeOf(context))),
onTap: () { onTap: () {
showDialog<ThemeType>( showDialog<ThemeType>(
context: context, context: context,
builder: (_) => DialogPicker<ThemeType>( builder: (_) => DialogPicker<ThemeType>(
icon: Icons.brightness_6, icon: Icons.brightness_6,
title: S.of(context).chooseTheme, title: S.of(context).chooseTheme,
selectedValue: EnumProviders.themeTypeOf(context), selectedValue: UserPreferencesProvider.themeTypeOf(context),
values: ThemeType.values, values: ThemeType.values,
titleAdapter: _typeToString, titleAdapter: _typeToString,
), ),
).then((value) { ).then((value) {
if (value != null) { if (value != null) {
EnumProviders.of(context).setThemeType(value); UserPreferencesProvider.of(context).setThemeType(value);
} }
}); });
}, },

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/enum_providers.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart';
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
import 'package:lightmeter/screens/settings/components/theme/components/dynamic_color/widget_list_tile_dynamic_color.dart'; import 'package:lightmeter/screens/settings/components/theme/components/dynamic_color/widget_list_tile_dynamic_color.dart';
import 'package:lightmeter/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart'; import 'package:lightmeter/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart';
@ -17,7 +17,7 @@ class ThemeSettingsSection extends StatelessWidget {
children: [ children: [
const ThemeTypeListTile(), const ThemeTypeListTile(),
const PrimaryColorListTile(), const PrimaryColorListTile(),
if (EnumProviders.dynamicColorStateOf(context) != DynamicColorState.unavailable) if (UserPreferencesProvider.dynamicColorStateOf(context) != DynamicColorState.unavailable)
const DynamicColorListTile(), const DynamicColorListTile(),
], ],
); );