diff --git a/lib/application.dart b/lib/application.dart index 478af5d..aec5b20 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -5,7 +5,9 @@ import 'package:lightmeter/data/ev_source/ev_source_type.dart'; import 'package:lightmeter/data/permissions_service.dart'; import 'package:lightmeter/screens/settings/settings_screen.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'data/shared_prefs_service.dart'; import 'generated/l10n.dart'; import 'res/theme.dart'; import 'screens/metering/flow_metering.dart'; @@ -38,35 +40,46 @@ class _ApplicationState extends State { @override Widget build(BuildContext context) { - return Provider.value( - value: widget.evSource, - child: Provider( - create: (context) => PermissionsService(), - child: StopTypeProvider( - child: MaterialApp( - theme: ThemeData( - useMaterial3: true, - colorScheme: lightColorScheme, - ), - localizationsDelegates: const [ - S.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, + return FutureBuilder( + future: SharedPreferences.getInstance(), + builder: (context, snapshot) { + if (snapshot.data != null) { + return MultiProvider( + providers: [ + Provider(create: (_) => UserPreferencesService(snapshot.data!)), + Provider.value(value: widget.evSource), ], - supportedLocales: S.delegate.supportedLocales, - builder: (context, child) => MediaQuery( - data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), - child: child!, + child: Provider( + create: (context) => PermissionsService(), + child: StopTypeProvider( + child: MaterialApp( + theme: ThemeData( + useMaterial3: true, + colorScheme: lightColorScheme, + ), + localizationsDelegates: const [ + S.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: S.delegate.supportedLocales, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), + child: child!, + ), + home: const MeteringFlow(), + routes: { + "metering": (context) => const MeteringFlow(), + "settings": (context) => const SettingsScreen(), + }, + ), + ), ), - home: const MeteringFlow(), - routes: { - "metering": (context) => const MeteringFlow(), - "settings": (context) => const SettingsScreen(), - }, - ), - ), - ), + ); + } + return const SizedBox(); + }, ); } } diff --git a/lib/models/aperture_value.dart b/lib/data/models/aperture_value.dart similarity index 100% rename from lib/models/aperture_value.dart rename to lib/data/models/aperture_value.dart diff --git a/lib/models/exposure_pair.dart b/lib/data/models/exposure_pair.dart similarity index 100% rename from lib/models/exposure_pair.dart rename to lib/data/models/exposure_pair.dart diff --git a/lib/models/iso_value.dart b/lib/data/models/iso_value.dart similarity index 100% rename from lib/models/iso_value.dart rename to lib/data/models/iso_value.dart diff --git a/lib/models/nd_value.dart b/lib/data/models/nd_value.dart similarity index 100% rename from lib/models/nd_value.dart rename to lib/data/models/nd_value.dart diff --git a/lib/models/photography_value.dart b/lib/data/models/photography_value.dart similarity index 100% rename from lib/models/photography_value.dart rename to lib/data/models/photography_value.dart diff --git a/lib/models/shutter_speed_value.dart b/lib/data/models/shutter_speed_value.dart similarity index 100% rename from lib/models/shutter_speed_value.dart rename to lib/data/models/shutter_speed_value.dart diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart new file mode 100644 index 0000000..012c04e --- /dev/null +++ b/lib/data/shared_prefs_service.dart @@ -0,0 +1,19 @@ +import 'package:lightmeter/data/models/nd_value.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'models/iso_value.dart'; + +class UserPreferencesService { + static const _isoKey = "ISO"; + static const _ndFilterKey = "ND"; + + final SharedPreferences _sharedPreferences; + + UserPreferencesService(this._sharedPreferences); + + IsoValue get iso => isoValues.firstWhere((v) => v.value == (_sharedPreferences.getInt(_isoKey) ?? 100)); + set iso(IsoValue value) => _sharedPreferences.setInt(_isoKey, value.value); + + NdValue get ndFilter => ndValues.firstWhere((v) => v.value == (_sharedPreferences.getInt(_ndFilterKey) ?? 0)); + set ndFilter(NdValue value) => _sharedPreferences.setInt(_ndFilterKey, value.value); +} diff --git a/lib/screens/metering/bloc_metering.dart b/lib/screens/metering/bloc_metering.dart index e54323a..c42b0a2 100644 --- a/lib/screens/metering/bloc_metering.dart +++ b/lib/screens/metering/bloc_metering.dart @@ -2,12 +2,11 @@ import 'dart:async'; import 'dart:math'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/models/aperture_value.dart'; -import 'package:lightmeter/models/exposure_pair.dart'; -import 'package:lightmeter/models/iso_value.dart'; -import 'package:lightmeter/models/nd_value.dart'; -import 'package:lightmeter/models/photography_value.dart'; -import 'package:lightmeter/models/shutter_speed_value.dart'; +import 'package:lightmeter/data/models/aperture_value.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; +import 'package:lightmeter/data/models/shutter_speed_value.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' as communication_events; import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart' as communication_states; import 'package:lightmeter/utils/log_2.dart'; @@ -18,6 +17,7 @@ import 'state_metering.dart'; class MeteringBloc extends Bloc { final MeteringCommunicationBloc _communicationBloc; + final UserPreferencesService _userPreferencesService; late final StreamSubscription _communicationSubscription; List get _apertureValues => apertureValues.whereStopType(stopType); @@ -25,13 +25,16 @@ class MeteringBloc extends Bloc { StopType stopType; - MeteringBloc(this._communicationBloc, this.stopType) - : super( + MeteringBloc( + this._communicationBloc, + this._userPreferencesService, + this.stopType, + ) : super( MeteringState( - iso: isoValues.where((element) => element.value == 100).first, + iso: _userPreferencesService.iso, ev: 0.0, evCompensation: 0.0, - nd: ndValues.first, + nd: _userPreferencesService.ndFilter, exposurePairs: [], ), ) { @@ -73,6 +76,7 @@ class MeteringBloc extends Bloc { } void _onIsoChanged(IsoChangedEvent event, Emitter emit) { + _userPreferencesService.iso = event.isoValue; final ev = state.ev + log2(event.isoValue.value / state.iso.value); emit(MeteringState( iso: event.isoValue, @@ -84,6 +88,7 @@ class MeteringBloc extends Bloc { } void _onNdChanged(NdChangedEvent event, Emitter emit) { + _userPreferencesService.ndFilter = event.ndValue; final ev = state.ev - event.ndValue.stopReduction + state.nd.stopReduction; emit(MeteringState( iso: state.iso, diff --git a/lib/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart b/lib/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart index c31e3ce..d2747b8 100644 --- a/lib/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart +++ b/lib/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:lightmeter/res/dimens.dart'; class ExposurePaitListItem extends StatelessWidget { diff --git a/lib/screens/metering/components/exposure_pairs_list/exposure_pairs_list.dart b/lib/screens/metering/components/exposure_pairs_list/exposure_pairs_list.dart index 2b66ccd..23dd10e 100644 --- a/lib/screens/metering/components/exposure_pairs_list/exposure_pairs_list.dart +++ b/lib/screens/metering/components/exposure_pairs_list/exposure_pairs_list.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/models/exposure_pair.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart'; diff --git a/lib/screens/metering/components/topbar/components/dialog_picker.dart b/lib/screens/metering/components/topbar/components/dialog_picker.dart index 7b41e0a..6f80e60 100644 --- a/lib/screens/metering/components/topbar/components/dialog_picker.dart +++ b/lib/screens/metering/components/topbar/components/dialog_picker.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:lightmeter/res/dimens.dart'; typedef DialogPickerItemBuilder = Widget Function(BuildContext, T); diff --git a/lib/screens/metering/components/topbar/topbar.dart b/lib/screens/metering/components/topbar/topbar.dart index 8bbfe9d..506dd08 100644 --- a/lib/screens/metering/components/topbar/topbar.dart +++ b/lib/screens/metering/components/topbar/topbar.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/models/exposure_pair.dart'; -import 'package:lightmeter/models/iso_value.dart'; -import 'package:lightmeter/models/nd_value.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/data/models/iso_value.dart'; +import 'package:lightmeter/data/models/nd_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:lightmeter/res/dimens.dart'; import 'components/camera_preview.dart'; diff --git a/lib/screens/metering/event_metering.dart b/lib/screens/metering/event_metering.dart index 275f03d..302aff2 100644 --- a/lib/screens/metering/event_metering.dart +++ b/lib/screens/metering/event_metering.dart @@ -1,6 +1,6 @@ -import 'package:lightmeter/models/iso_value.dart'; -import 'package:lightmeter/models/nd_value.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/iso_value.dart'; +import 'package:lightmeter/data/models/nd_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; abstract class MeteringEvent { const MeteringEvent(); diff --git a/lib/screens/metering/flow_metering.dart b/lib/screens/metering/flow_metering.dart index 1fe20f0..6274c10 100644 --- a/lib/screens/metering/flow_metering.dart +++ b/lib/screens/metering/flow_metering.dart @@ -3,7 +3,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart'; import 'package:lightmeter/data/ev_source/ev_source_type.dart'; import 'package:lightmeter/data/ev_source/random_ev/bloc_random_ev.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; @@ -20,6 +21,7 @@ class MeteringFlow extends StatelessWidget { BlocProvider( create: (context) => MeteringBloc( context.read(), + context.read(), context.read(), ), ), diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 480dba0..9dc44a6 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/settings_screen.dart'; diff --git a/lib/screens/metering/state_metering.dart b/lib/screens/metering/state_metering.dart index f6dbb17..b18016c 100644 --- a/lib/screens/metering/state_metering.dart +++ b/lib/screens/metering/state_metering.dart @@ -1,6 +1,6 @@ -import 'package:lightmeter/models/exposure_pair.dart'; -import 'package:lightmeter/models/iso_value.dart'; -import 'package:lightmeter/models/nd_value.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/data/models/iso_value.dart'; +import 'package:lightmeter/data/models/nd_value.dart'; class MeteringState { final double ev; diff --git a/lib/screens/settings/components/fractional_stops/dialog_fractional_stops.dart b/lib/screens/settings/components/fractional_stops/dialog_fractional_stops.dart index 40b9a4a..2c4514b 100644 --- a/lib/screens/settings/components/fractional_stops/dialog_fractional_stops.dart +++ b/lib/screens/settings/components/fractional_stops/dialog_fractional_stops.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; class FractionalStopsDialog extends StatefulWidget { final StopType selectedType; diff --git a/lib/screens/settings/components/fractional_stops/list_tile_fractional_stops.dart b/lib/screens/settings/components/fractional_stops/list_tile_fractional_stops.dart index dac28af..5f75f0c 100644 --- a/lib/screens/settings/components/fractional_stops/list_tile_fractional_stops.dart +++ b/lib/screens/settings/components/fractional_stops/list_tile_fractional_stops.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:lightmeter/utils/stop_type_provider.dart'; import 'package:provider/provider.dart'; diff --git a/lib/utils/stop_type_provider.dart b/lib/utils/stop_type_provider.dart index ae9f041..8a6b619 100644 --- a/lib/utils/stop_type_provider.dart +++ b/lib/utils/stop_type_provider.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; import 'package:provider/provider.dart'; class StopTypeProvider extends StatefulWidget { diff --git a/pubspec.yaml b/pubspec.yaml index c9d5f79..fa6bb99 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: material_color_utilities: ^0.2.0 permission_handler: 10.2.0 provider: ^6.0.4 + shared_preferences: 2.0.15 dev_dependencies: google_fonts: ^3.0.1 diff --git a/test/photograpy_values_test.dart b/test/photograpy_values_test.dart index 7af90b9..b3bd4eb 100644 --- a/test/photograpy_values_test.dart +++ b/test/photograpy_values_test.dart @@ -1,7 +1,7 @@ -import 'package:lightmeter/models/aperture_value.dart'; -import 'package:lightmeter/models/iso_value.dart'; -import 'package:lightmeter/models/photography_value.dart'; -import 'package:lightmeter/models/shutter_speed_value.dart'; +import 'package:lightmeter/data/models/aperture_value.dart'; +import 'package:lightmeter/data/models/iso_value.dart'; +import 'package:lightmeter/data/models/photography_value.dart'; +import 'package:lightmeter/data/models/shutter_speed_value.dart'; import 'package:test/test.dart'; void main() {