From b13acedebd693d3e9c82e036e143a5019c658e9d Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Mon, 10 Jul 2023 17:49:34 +0200 Subject: [PATCH 01/49] ML-62 Interactors tests (#87) * removed redundant `UserPreferencesService` from `MeteringBloc` * wip * post-merge fixes * `MeasureEvent` tests * `MeasureEvent` tests revision * `MeasureEvent` tests added timeout * added stubs for other `MeteringBloc` events * rewritten `MeteringBloc` logic * wip * `IsoChangedEvent` tests * refined `IsoChangedEvent` tests * `NdChangedEvent` tests * `FilmChangedEvent` tests * `MeteringCommunicationBloc` tests * added test run to ci * overriden `==` for `MeasuredState` * `LuxMeteringEvent` tests * refined `LuxMeteringEvent` tests * rename * wip * wip * `InitializeEvent`/`DeinitializeEvent` tests * clamp minZoomLevel * fixed `MeteringCommunicationBloc` tests * wip * `ZoomChangedEvent` tests * `ExposureOffsetChangedEvent`/`ExposureOffsetResetEvent` tests * renamed test groups * added test coverage script * improved `CameraContainerBloc` test coverage * `EquipmentProfileChangedEvent` tests * verify response vibration * fixed running all tests * `MeteringCommunicationBloc` equality tests * `CameraContainerBloc` equality tests * removed generated code from coverage * `MeteringScreenLayoutFeature` tests * `SupportedLocale` tests * `Film` tests * `CaffeineService` tests * `UserPreferencesService` tests (wip) * `LightSensorService` tests (wip) * `migrateOldKeys()` tests * ignore currently unused getters & setters * gradle upgrade * `reset(sharedPreferences);` calls count * typo * `MeteringInteractor` tests * `SettingsInteractor` tests (wip) * `MeteringInteractor` tests (wip) * `SettingsInteractor` tests --- analysis_options.yaml | 1 - lib/interactors/metering_interactor.dart | 6 +- lib/interactors/settings_interactor.dart | 2 +- .../bloc_container_camera.dart | 2 +- lib/screens/metering/flow_metering.dart | 2 +- .../interactors/metering_interactor_test.dart | 274 ++++++++++++++++++ .../interactors/settings_interactor_test.dart | 205 +++++++++++++ .../camera/bloc_container_camera_test.dart | 12 +- 8 files changed, 492 insertions(+), 12 deletions(-) create mode 100644 test/interactors/metering_interactor_test.dart create mode 100644 test/interactors/settings_interactor_test.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index c8e8d30..7f980c4 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,6 +1,5 @@ include: package:lint/strict.yaml - linter: rules: use_setters_to_change_properties: false diff --git a/lib/interactors/metering_interactor.dart b/lib/interactors/metering_interactor.dart index 34b03ec..7ea25ac 100644 --- a/lib/interactors/metering_interactor.dart +++ b/lib/interactors/metering_interactor.dart @@ -25,7 +25,9 @@ class MeteringInteractor { this._permissionsService, this._lightSensorService, this._volumeEventsService, - ) { + ); + + void initialize() { if (_userPreferencesService.caffeine) { _caffeineService.keepScreenOn(true); } @@ -69,7 +71,7 @@ class MeteringInteractor { .then((value) => value == PermissionStatus.granted); } - Future requestPermission() async { + Future requestCameraPermission() async { return _permissionsService .requestCameraPermission() .then((value) => value == PermissionStatus.granted); diff --git a/lib/interactors/settings_interactor.dart b/lib/interactors/settings_interactor.dart index 4eeb8b9..8f74dd2 100644 --- a/lib/interactors/settings_interactor.dart +++ b/lib/interactors/settings_interactor.dart @@ -41,8 +41,8 @@ class SettingsInteractor { VolumeAction get volumeAction => _userPreferencesService.volumeAction; Future setVolumeAction(VolumeAction value) async { - await _volumeEventsService.setVolumeHandling(value != VolumeAction.none); _userPreferencesService.volumeAction = value; + await _volumeEventsService.setVolumeHandling(value != VolumeAction.none); } bool get isHapticsEnabled => _userPreferencesService.haptics; diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index 7f00256..cafce13 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -92,7 +92,7 @@ class CameraContainerBloc extends EvSourceBlocBase _onRequestPermission(_, Emitter emit) async { - final hasPermission = await _meteringInteractor.requestPermission(); + final hasPermission = await _meteringInteractor.requestCameraPermission(); if (!hasPermission) { emit(const CameraErrorState(CameraErrorType.permissionNotGranted)); } else { diff --git a/lib/screens/metering/flow_metering.dart b/lib/screens/metering/flow_metering.dart index 780f537..1caef02 100644 --- a/lib/screens/metering/flow_metering.dart +++ b/lib/screens/metering/flow_metering.dart @@ -31,7 +31,7 @@ class _MeteringFlowState extends State { context.get(), context.get(), context.get(), - ), + )..initialize(), child: InheritedWidgetBase( data: VolumeKeysNotifier(context.get()), child: MultiBlocProvider( diff --git a/test/interactors/metering_interactor_test.dart b/test/interactors/metering_interactor_test.dart new file mode 100644 index 0000000..bd6a169 --- /dev/null +++ b/test/interactors/metering_interactor_test.dart @@ -0,0 +1,274 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/light_sensor_service.dart'; +import 'package:lightmeter/data/models/film.dart'; +import 'package:lightmeter/data/models/volume_action.dart'; +import 'package:lightmeter/data/permissions_service.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; +import 'package:lightmeter/interactors/metering_interactor.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class _MockUserPreferencesService extends Mock implements UserPreferencesService {} + +class _MockCaffeineService extends Mock implements CaffeineService {} + +class _MockHapticsService extends Mock implements HapticsService {} + +class _MockPermissionsService extends Mock implements PermissionsService {} + +class _MockLightSensorService extends Mock implements LightSensorService {} + +class _MockVolumeEventsService extends Mock implements VolumeEventsService {} + +void main() { + late _MockUserPreferencesService mockUserPreferencesService; + late _MockCaffeineService mockCaffeineService; + late _MockHapticsService mockHapticsService; + late _MockPermissionsService mockPermissionsService; + late _MockLightSensorService mockLightSensorService; + late _MockVolumeEventsService mockVolumeEventsService; + + late MeteringInteractor interactor; + + setUp(() { + mockUserPreferencesService = _MockUserPreferencesService(); + mockCaffeineService = _MockCaffeineService(); + mockHapticsService = _MockHapticsService(); + mockPermissionsService = _MockPermissionsService(); + mockLightSensorService = _MockLightSensorService(); + mockVolumeEventsService = _MockVolumeEventsService(); + + interactor = MeteringInteractor( + mockUserPreferencesService, + mockCaffeineService, + mockHapticsService, + mockPermissionsService, + mockLightSensorService, + mockVolumeEventsService, + ); + }); + + group( + 'Initalization', + () { + test('caffeine - true', () async { + when(() => mockUserPreferencesService.caffeine).thenReturn(true); + when(() => mockCaffeineService.keepScreenOn(true)).thenAnswer((_) async => true); + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + when(() => mockVolumeEventsService.setVolumeHandling(true)).thenAnswer((_) async => true); + interactor.initialize(); + verify(() => mockUserPreferencesService.caffeine).called(1); + verify(() => mockCaffeineService.keepScreenOn(true)).called(1); + verify(() => mockVolumeEventsService.setVolumeHandling(true)).called(1); + }); + + test('caffeine - false', () async { + when(() => mockUserPreferencesService.caffeine).thenReturn(false); + when(() => mockCaffeineService.keepScreenOn(false)).thenAnswer((_) async => false); + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + when(() => mockVolumeEventsService.setVolumeHandling(true)).thenAnswer((_) async => true); + interactor.initialize(); + verify(() => mockUserPreferencesService.caffeine).called(1); + verifyNever(() => mockCaffeineService.keepScreenOn(false)); + verify(() => mockVolumeEventsService.setVolumeHandling(true)).called(1); + }); + }, + ); + + group( + 'Calibration', + () { + test('cameraEvCalibration', () async { + when(() => mockUserPreferencesService.cameraEvCalibration).thenReturn(0.0); + expect(interactor.cameraEvCalibration, 0.0); + verify(() => mockUserPreferencesService.cameraEvCalibration).called(1); + }); + + test('lightSensorEvCalibration', () async { + when(() => mockUserPreferencesService.lightSensorEvCalibration).thenReturn(0.0); + expect(interactor.lightSensorEvCalibration, 0.0); + verify(() => mockUserPreferencesService.lightSensorEvCalibration).called(1); + }); + }, + ); + + group( + 'Equipment', + () { + test('iso - get', () async { + when(() => mockUserPreferencesService.iso).thenReturn(IsoValue.values.first); + expect(interactor.iso, IsoValue.values.first); + verify(() => mockUserPreferencesService.iso).called(1); + }); + + test('iso - set', () async { + when(() => mockUserPreferencesService.iso = IsoValue.values.first) + .thenReturn(IsoValue.values.first); + interactor.iso = IsoValue.values.first; + verify(() => mockUserPreferencesService.iso = IsoValue.values.first).called(1); + }); + + test('ndFilter - get', () async { + when(() => mockUserPreferencesService.ndFilter).thenReturn(NdValue.values.first); + expect(interactor.ndFilter, NdValue.values.first); + verify(() => mockUserPreferencesService.ndFilter).called(1); + }); + + test('ndFilter - set', () async { + when(() => mockUserPreferencesService.ndFilter = NdValue.values.first) + .thenReturn(NdValue.values.first); + interactor.ndFilter = NdValue.values.first; + verify(() => mockUserPreferencesService.ndFilter = NdValue.values.first).called(1); + }); + + test('film - get', () async { + when(() => mockUserPreferencesService.film).thenReturn(Film.values.first); + expect(interactor.film, Film.values.first); + verify(() => mockUserPreferencesService.film).called(1); + }); + + test('film - set', () async { + when(() => mockUserPreferencesService.film = Film.values.first) + .thenReturn(Film.values.first); + interactor.film = Film.values.first; + verify(() => mockUserPreferencesService.film = Film.values.first).called(1); + }); + }, + ); + + group( + 'Volume action', + () { + test('volumeAction - VolumeAction.shutter', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + expect(interactor.volumeAction, VolumeAction.shutter); + verify(() => mockUserPreferencesService.volumeAction).called(1); + }); + + test('volumeAction - VolumeAction.none', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.none); + expect(interactor.volumeAction, VolumeAction.none); + verify(() => mockUserPreferencesService.volumeAction).called(1); + }); + }, + ); + + group( + 'Haptics', + () { + test('isHapticsEnabled', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + expect(interactor.isHapticsEnabled, true); + verify(() => mockUserPreferencesService.haptics).called(1); + }); + + test('quickVibration() - true', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.quickVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.quickVibration()).called(1); + }); + + test('quickVibration() - false', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.quickVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.quickVibration()); + }); + + test('responseVibration() - true', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + interactor.responseVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.responseVibration()).called(1); + }); + + test('responseVibration() - false', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + interactor.responseVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.responseVibration()); + }); + + test('errorVibration() - true', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.errorVibration()).thenAnswer((_) async {}); + interactor.errorVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.errorVibration()).called(1); + }); + + test('errorVibration() - false', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.errorVibration()).thenAnswer((_) async {}); + interactor.errorVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.errorVibration()); + }); + }, + ); + + group( + 'Permissions', + () { + test('checkCameraPermission() - granted', () async { + when(() => mockPermissionsService.checkCameraPermission()) + .thenAnswer((_) async => PermissionStatus.granted); + expectLater(interactor.checkCameraPermission(), completion(true)); + verify(() => mockPermissionsService.checkCameraPermission()).called(1); + }); + + test('checkCameraPermission() - denied', () async { + when(() => mockPermissionsService.checkCameraPermission()) + .thenAnswer((_) async => PermissionStatus.denied); + expectLater(interactor.checkCameraPermission(), completion(false)); + verify(() => mockPermissionsService.checkCameraPermission()).called(1); + }); + + test('requestCameraPermission() - granted', () async { + when(() => mockPermissionsService.requestCameraPermission()) + .thenAnswer((_) async => PermissionStatus.granted); + expectLater(interactor.requestCameraPermission(), completion(true)); + verify(() => mockPermissionsService.requestCameraPermission()).called(1); + }); + + test('requestCameraPermission() - denied', () async { + when(() => mockPermissionsService.requestCameraPermission()) + .thenAnswer((_) async => PermissionStatus.denied); + expectLater(interactor.requestCameraPermission(), completion(false)); + verify(() => mockPermissionsService.requestCameraPermission()).called(1); + }); + }, + ); + + group( + 'Haptics', + () { + test('hasAmbientLightSensor() - true', () async { + when(() => mockLightSensorService.hasSensor()).thenAnswer((_) async => true); + expectLater(interactor.hasAmbientLightSensor(), completion(true)); + verify(() => mockLightSensorService.hasSensor()).called(1); + }); + + test('hasAmbientLightSensor() - false', () async { + when(() => mockLightSensorService.hasSensor()).thenAnswer((_) async => false); + expectLater(interactor.hasAmbientLightSensor(), completion(false)); + verify(() => mockLightSensorService.hasSensor()).called(1); + }); + + test('luxStream()', () async { + when(() => mockLightSensorService.luxStream()).thenAnswer((_) => const Stream.empty()); + expect(interactor.luxStream(), const Stream.empty()); + verify(() => mockLightSensorService.luxStream()).called(1); + }); + }, + ); +} diff --git a/test/interactors/settings_interactor_test.dart b/test/interactors/settings_interactor_test.dart new file mode 100644 index 0000000..03437dc --- /dev/null +++ b/test/interactors/settings_interactor_test.dart @@ -0,0 +1,205 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/models/volume_action.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; +import 'package:lightmeter/interactors/settings_interactor.dart'; +import 'package:mocktail/mocktail.dart'; + +class _MockUserPreferencesService extends Mock implements UserPreferencesService {} + +class _MockCaffeineService extends Mock implements CaffeineService {} + +class _MockHapticsService extends Mock implements HapticsService {} + +class _MockVolumeEventsService extends Mock implements VolumeEventsService {} + +void main() { + late _MockUserPreferencesService mockUserPreferencesService; + late _MockCaffeineService mockCaffeineService; + late _MockHapticsService mockHapticsService; + late _MockVolumeEventsService mockVolumeEventsService; + + late SettingsInteractor interactor; + + setUp(() { + mockUserPreferencesService = _MockUserPreferencesService(); + mockCaffeineService = _MockCaffeineService(); + mockHapticsService = _MockHapticsService(); + mockVolumeEventsService = _MockVolumeEventsService(); + + interactor = SettingsInteractor( + mockUserPreferencesService, + mockCaffeineService, + mockHapticsService, + mockVolumeEventsService, + ); + }); + + group( + 'Calibration', + () { + test('cameraEvCalibration - get', () async { + when(() => mockUserPreferencesService.cameraEvCalibration).thenReturn(0.0); + expect(interactor.cameraEvCalibration, 0.0); + verify(() => mockUserPreferencesService.cameraEvCalibration).called(1); + }); + + test('cameraEvCalibration - set', () async { + when(() => mockUserPreferencesService.cameraEvCalibration = 0.0).thenReturn(0.0); + interactor.setCameraEvCalibration(0.0); + verify(() => mockUserPreferencesService.cameraEvCalibration = 0.0).called(1); + }); + + test('lightSensorEvCalibration - get', () async { + when(() => mockUserPreferencesService.lightSensorEvCalibration).thenReturn(0.0); + expect(interactor.lightSensorEvCalibration, 0.0); + verify(() => mockUserPreferencesService.lightSensorEvCalibration).called(1); + }); + + test('lightSensorEvCalibration - set', () async { + when(() => mockUserPreferencesService.lightSensorEvCalibration = 0.0).thenReturn(0.0); + interactor.setLightSensorEvCalibration(0.0); + verify(() => mockUserPreferencesService.lightSensorEvCalibration = 0.0).called(1); + }); + }, + ); + + group( + 'Caffeine', + () { + test('isCaffeineEnabled', () async { + when(() => mockUserPreferencesService.caffeine).thenReturn(true); + expect(interactor.isCaffeineEnabled, true); + verify(() => mockUserPreferencesService.caffeine).called(1); + }); + + test('enableCaffeine(true)', () async { + when(() => mockCaffeineService.keepScreenOn(true)).thenAnswer((_) async => true); + when(() => mockUserPreferencesService.caffeine = true).thenReturn(true); + await interactor.enableCaffeine(true); + verify(() => mockCaffeineService.keepScreenOn(true)).called(1); + verify(() => mockUserPreferencesService.caffeine = true).called(1); + }); + }, + ); + + group( + 'Volume action', + () { + test('disableVolumeHandling()', () async { + when(() => mockVolumeEventsService.setVolumeHandling(false)).thenAnswer((_) async => false); + expectLater(interactor.disableVolumeHandling(), isA>()); + verify(() => mockVolumeEventsService.setVolumeHandling(false)).called(1); + }); + + test('restoreVolumeHandling() - VolumeAction.shutter', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + when(() => mockVolumeEventsService.setVolumeHandling(true)).thenAnswer((_) async => true); + expectLater(interactor.restoreVolumeHandling(), isA>()); + verify(() => mockUserPreferencesService.volumeAction).called(1); + verify(() => mockVolumeEventsService.setVolumeHandling(true)).called(1); + }); + + test('restoreVolumeHandling() - VolumeAction.none', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.none); + when(() => mockVolumeEventsService.setVolumeHandling(false)).thenAnswer((_) async => false); + expectLater(interactor.restoreVolumeHandling(), isA>()); + verify(() => mockUserPreferencesService.volumeAction).called(1); + verify(() => mockVolumeEventsService.setVolumeHandling(false)).called(1); + }); + + test('volumeAction - VolumeAction.shutter', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + expect(interactor.volumeAction, VolumeAction.shutter); + verify(() => mockUserPreferencesService.volumeAction).called(1); + }); + + test('volumeAction - VolumeAction.none', () async { + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.none); + expect(interactor.volumeAction, VolumeAction.none); + verify(() => mockUserPreferencesService.volumeAction).called(1); + }); + + test('setVolumeAction(VolumeAction.shutter)', () async { + when(() => mockUserPreferencesService.volumeAction = VolumeAction.shutter) + .thenReturn(VolumeAction.shutter); + when(() => mockVolumeEventsService.setVolumeHandling(true)).thenAnswer((_) async => true); + expectLater(interactor.setVolumeAction(VolumeAction.shutter), isA>()); + verify(() => mockVolumeEventsService.setVolumeHandling(true)).called(1); + verify(() => mockUserPreferencesService.volumeAction = VolumeAction.shutter).called(1); + }); + + test('setVolumeAction(VolumeAction.none)', () async { + when(() => mockUserPreferencesService.volumeAction = VolumeAction.none) + .thenReturn(VolumeAction.none); + when(() => mockVolumeEventsService.setVolumeHandling(false)).thenAnswer((_) async => false); + expectLater(interactor.setVolumeAction(VolumeAction.none), isA>()); + verify(() => mockVolumeEventsService.setVolumeHandling(false)).called(1); + verify(() => mockUserPreferencesService.volumeAction = VolumeAction.none).called(1); + }); + }, + ); + + group( + 'Haptics', + () { + test('isHapticsEnabled', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + expect(interactor.isHapticsEnabled, true); + verify(() => mockUserPreferencesService.haptics).called(1); + }); + + test('enableHaptics() - true', () async { + when(() => mockUserPreferencesService.haptics = true).thenReturn(true); + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.enableHaptics(true); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.quickVibration()).called(1); + }); + + test('enableHaptics() - false', () async { + when(() => mockUserPreferencesService.haptics = false).thenReturn(false); + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.enableHaptics(false); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.quickVibration()); + }); + + test('quickVibration() - true', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.quickVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.quickVibration()).called(1); + }); + + test('quickVibration() - false', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + interactor.quickVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.quickVibration()); + }); + + test('responseVibration() - true', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + interactor.responseVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verify(() => mockHapticsService.responseVibration()).called(1); + }); + + test('responseVibration() - false', () async { + when(() => mockUserPreferencesService.haptics).thenReturn(false); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + interactor.responseVibration(); + verify(() => mockUserPreferencesService.haptics).called(1); + verifyNever(() => mockHapticsService.responseVibration()); + }); + }, + ); +} diff --git a/test/screens/metering/components/camera/bloc_container_camera_test.dart b/test/screens/metering/components/camera/bloc_container_camera_test.dart index fa08edf..d54c0a5 100644 --- a/test/screens/metering/components/camera/bloc_container_camera_test.dart +++ b/test/screens/metering/components/camera/bloc_container_camera_test.dart @@ -140,11 +140,11 @@ void main() { 'Request denied', build: () => bloc, setUp: () { - when(() => meteringInteractor.requestPermission()).thenAnswer((_) async => false); + when(() => meteringInteractor.requestCameraPermission()).thenAnswer((_) async => false); }, act: (bloc) => bloc.add(const RequestPermissionEvent()), verify: (_) { - verify(() => meteringInteractor.requestPermission()).called(1); + verify(() => meteringInteractor.requestCameraPermission()).called(1); }, expect: () => [ isA() @@ -156,12 +156,12 @@ void main() { 'Request granted -> check denied', build: () => bloc, setUp: () { - when(() => meteringInteractor.requestPermission()).thenAnswer((_) async => true); + when(() => meteringInteractor.requestCameraPermission()).thenAnswer((_) async => true); when(() => meteringInteractor.checkCameraPermission()).thenAnswer((_) async => false); }, act: (bloc) => bloc.add(const RequestPermissionEvent()), verify: (_) { - verify(() => meteringInteractor.requestPermission()).called(1); + verify(() => meteringInteractor.requestCameraPermission()).called(1); verify(() => meteringInteractor.checkCameraPermission()).called(1); }, expect: () => [ @@ -175,12 +175,12 @@ void main() { 'Request granted -> check granted', build: () => bloc, setUp: () { - when(() => meteringInteractor.requestPermission()).thenAnswer((_) async => true); + when(() => meteringInteractor.requestCameraPermission()).thenAnswer((_) async => true); when(() => meteringInteractor.checkCameraPermission()).thenAnswer((_) async => true); }, act: (bloc) => bloc.add(const RequestPermissionEvent()), verify: (_) { - verify(() => meteringInteractor.requestPermission()).called(1); + verify(() => meteringInteractor.requestCameraPermission()).called(1); verify(() => meteringInteractor.checkCameraPermission()).called(1); }, expect: () => initializedStateSequence, From dbf1f09eb68e1b0e9ec817a500f4695f186288bb Mon Sep 17 00:00:00 2001 From: Vadim Date: Mon, 24 Jul 2023 09:08:37 +0200 Subject: [PATCH 02/49] Renamed `EquipmentProfileData` -> `EquipmentProfile` --- lib/data/models/supported_locale.dart | 4 +++- lib/data/shared_prefs_service.dart | 4 ++-- lib/providers/equipment_profile_provider.dart | 21 +++++++++---------- .../widget_container_readings.dart | 2 +- lib/screens/metering/event_metering.dart | 2 +- lib/screens/metering/screen_metering.dart | 1 - .../widget_container_equipment_profile.dart | 10 ++++----- .../screen_equipment_profile.dart | 2 +- .../widget_list_tile_equipment_profiles.dart | 2 +- test/screens/metering/bloc_metering_test.dart | 2 +- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/data/models/supported_locale.dart b/lib/data/models/supported_locale.dart index e5f6dcb..445a30c 100644 --- a/lib/data/models/supported_locale.dart +++ b/lib/data/models/supported_locale.dart @@ -1,4 +1,4 @@ -enum SupportedLocale { en, fr, ru } +enum SupportedLocale { en, fr, ru, cn } extension SupportedLocaleExtension on SupportedLocale { String get intlName => toString().replaceAll("SupportedLocale.", ""); @@ -11,6 +11,8 @@ extension SupportedLocaleExtension on SupportedLocale { return 'Français'; case SupportedLocale.ru: return 'Русский'; + case SupportedLocale.cn: + return '<--->'; } } } diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart index 76f9045..8105d5c 100644 --- a/lib/data/shared_prefs_service.dart +++ b/lib/data/shared_prefs_service.dart @@ -150,6 +150,6 @@ class UserPreferencesService { String get selectedEquipmentProfileId => ''; // coverage:ignore-line set selectedEquipmentProfileId(String id) {} // coverage:ignore-line - List get equipmentProfiles => []; // coverage:ignore-line - set equipmentProfiles(List profiles) {} // coverage:ignore-line + List get equipmentProfiles => []; // coverage:ignore-line + set equipmentProfiles(List profiles) {} // coverage:ignore-line } diff --git a/lib/providers/equipment_profile_provider.dart b/lib/providers/equipment_profile_provider.dart index c5ef82d..85c9377 100644 --- a/lib/providers/equipment_profile_provider.dart +++ b/lib/providers/equipment_profile_provider.dart @@ -4,8 +4,7 @@ import 'package:lightmeter/utils/inherited_generics.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:uuid/uuid.dart'; -typedef EquipmentProfiles = List; -typedef EquipmentProfile = EquipmentProfileData; +typedef EquipmentProfiles = List; class EquipmentProfileProvider extends StatefulWidget { final Widget child; @@ -21,7 +20,7 @@ class EquipmentProfileProvider extends StatefulWidget { } class EquipmentProfileProviderState extends State { - static const EquipmentProfileData _defaultProfile = EquipmentProfileData( + static const EquipmentProfile _defaultProfile = EquipmentProfile( id: '', name: '', apertureValues: ApertureValue.values, @@ -30,10 +29,10 @@ class EquipmentProfileProviderState extends State { isoValues: IsoValue.values, ); - List _customProfiles = []; + List _customProfiles = []; String _selectedId = ''; - EquipmentProfileData get _selectedProfile => _customProfiles.firstWhere( + EquipmentProfile get _selectedProfile => _customProfiles.firstWhere( (e) => e.id == _selectedId, orElse: () { context.get().selectedEquipmentProfileId = _defaultProfile.id; @@ -50,16 +49,16 @@ class EquipmentProfileProviderState extends State { @override Widget build(BuildContext context) { - return InheritedWidgetBase>( + return InheritedWidgetBase>( data: [_defaultProfile] + _customProfiles, - child: InheritedWidgetBase( + child: InheritedWidgetBase( data: _selectedProfile, child: widget.child, ), ); } - void setProfile(EquipmentProfileData data) { + void setProfile(EquipmentProfile data) { setState(() { _selectedId = data.id; }); @@ -69,7 +68,7 @@ class EquipmentProfileProviderState extends State { /// Creates a default equipment profile void addProfile(String name) { _customProfiles.add( - EquipmentProfileData( + EquipmentProfile( id: const Uuid().v1(), name: name, apertureValues: ApertureValue.values, @@ -81,7 +80,7 @@ class EquipmentProfileProviderState extends State { _refreshSavedProfiles(); } - void updateProdile(EquipmentProfileData data) { + void updateProdile(EquipmentProfile data) { final indexToUpdate = _customProfiles.indexWhere((element) => element.id == data.id); if (indexToUpdate >= 0) { _customProfiles[indexToUpdate] = data; @@ -89,7 +88,7 @@ class EquipmentProfileProviderState extends State { } } - void deleteProfile(EquipmentProfileData data) { + void deleteProfile(EquipmentProfile data) { _customProfiles.remove(data); _refreshSavedProfiles(); } diff --git a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart index 09f8bce..0893305 100644 --- a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart +++ b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart @@ -105,7 +105,7 @@ class _EquipmentProfilePicker extends StatelessWidget { @override Widget build(BuildContext context) { - return AnimatedDialogPicker( + return AnimatedDialogPicker( icon: Icons.camera, title: S.of(context).equipmentProfile, selectedValue: context.listen(), diff --git a/lib/screens/metering/event_metering.dart b/lib/screens/metering/event_metering.dart index 852b5e4..bf3a22d 100644 --- a/lib/screens/metering/event_metering.dart +++ b/lib/screens/metering/event_metering.dart @@ -6,7 +6,7 @@ sealed class MeteringEvent { } class EquipmentProfileChangedEvent extends MeteringEvent { - final EquipmentProfileData equipmentProfileData; + final EquipmentProfile equipmentProfileData; const EquipmentProfileChangedEvent(this.equipmentProfileData); } diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 4fb1e85..bbfebfc 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -7,7 +7,6 @@ import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/environment.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/ev_source_type_provider.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/components/bottom_controls/provider_bottom_controls.dart'; diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index b240611..1d9b7bf 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -8,8 +8,8 @@ import 'package:lightmeter/screens/settings/components/metering/components/equip import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileContainer extends StatefulWidget { - final EquipmentProfileData data; - final ValueChanged onUpdate; + final EquipmentProfile data; + final ValueChanged onUpdate; final VoidCallback onDelete; final VoidCallback onExpand; @@ -27,7 +27,7 @@ class EquipmentProfileContainer extends StatefulWidget { class EquipmentProfileContainerState extends State with TickerProviderStateMixin { - late EquipmentProfileData _equipmentData = EquipmentProfileData( + late EquipmentProfile _equipmentData = EquipmentProfile( id: widget.data.id, name: widget.data.name, apertureValues: widget.data.apertureValues, @@ -45,7 +45,7 @@ class EquipmentProfileContainerState extends State @override void didUpdateWidget(EquipmentProfileContainer oldWidget) { super.didUpdateWidget(oldWidget); - _equipmentData = EquipmentProfileData( + _equipmentData = EquipmentProfile( id: widget.data.id, name: widget.data.name, apertureValues: widget.data.apertureValues, @@ -195,7 +195,7 @@ class _AnimatedArrowButton extends AnimatedWidget { } class _AnimatedEquipmentListTiles extends AnimatedWidget { - final EquipmentProfileData equipmentData; + final EquipmentProfile equipmentData; final ValueChanged> onApertureValuesSelected; final ValueChanged> onIsoValuesSelecred; final ValueChanged> onNdValuesSelected; diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index 25ca59a..4872d79 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -84,7 +84,7 @@ class _EquipmentProfilesScreenState extends State { }); } - void _updateProfileAt(EquipmentProfileData data, int index) { + void _updateProfileAt(EquipmentProfile data, int index) { EquipmentProfileProvider.of(context).updateProdile(data); } diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart index 13cb6f0..d1a6ef3 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart @@ -12,7 +12,7 @@ class EquipmentProfilesListTile extends StatelessWidget { leading: const Icon(Icons.camera), title: Text(S.of(context).equipmentProfiles), onTap: () { - Navigator.of(context).push( + Navigator.of(context).push( MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()), ); }, diff --git a/test/screens/metering/bloc_metering_test.dart b/test/screens/metering/bloc_metering_test.dart index 3593c91..45b9291 100644 --- a/test/screens/metering/bloc_metering_test.dart +++ b/test/screens/metering/bloc_metering_test.dart @@ -495,7 +495,7 @@ void main() { group( '`EquipmentProfileChangedEvent`', () { - final reducedProfile = EquipmentProfileData( + final reducedProfile = EquipmentProfile( id: '0', name: 'Reduced', apertureValues: ApertureValue.values, From bb9b023fa7c7d3e788f1b87cac39921de99c01e6 Mon Sep 17 00:00:00 2001 From: ScaredCube <74418739+ScaredCube@users.noreply.github.com> Date: Mon, 24 Jul 2023 15:35:30 +0800 Subject: [PATCH 03/49] Add Chinese language support (#91) * Add Chinese language support * Update intl_cn.arb * Fixed some bugs * Add Chinese language support * renamed `cn` to `zh` --------- Co-authored-by: Vadim <44135514+vodemn@users.noreply.github.com> Co-authored-by: Vadim --- lib/data/models/supported_locale.dart | 6 +- lib/l10n/intl_zh.arb | 88 +++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 lib/l10n/intl_zh.arb diff --git a/lib/data/models/supported_locale.dart b/lib/data/models/supported_locale.dart index 445a30c..0d93a50 100644 --- a/lib/data/models/supported_locale.dart +++ b/lib/data/models/supported_locale.dart @@ -1,4 +1,4 @@ -enum SupportedLocale { en, fr, ru, cn } +enum SupportedLocale { en, fr, ru, zh } extension SupportedLocaleExtension on SupportedLocale { String get intlName => toString().replaceAll("SupportedLocale.", ""); @@ -11,8 +11,8 @@ extension SupportedLocaleExtension on SupportedLocale { return 'Français'; case SupportedLocale.ru: return 'Русский'; - case SupportedLocale.cn: - return '<--->'; + case SupportedLocale.zh: + return '简体中文'; } } } diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb new file mode 100644 index 0000000..b011254 --- /dev/null +++ b/lib/l10n/intl_zh.arb @@ -0,0 +1,88 @@ +{ + "@@locale": "zh", + "fastestExposurePair": "最快曝光组合", + "slowestExposurePair": "最慢曝光组合", + "ev": "EV", + "evValue": "{value} EV", + "@evValue": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "iso": "ISO", + "filmSpeed": "胶片感光度", + "nd": "ND", + "ndFilterFactor": "ND 滤镜系数", + "noExposurePairs": "所选设置没有曝光配对", + "noCamerasDetected": "您的设备似乎没有连接到任何摄像头", + "noCameraPermission": "未获得摄像头权限", + "otherCameraError": "连接摄像头时发生错误", + "none": "无", + "cancel": "取消", + "select": "选择", + "save": "保存", + "settings": "设置", + "metering": "测量", + "fractionalStops": "分数位", + "showFractionalStops": "显示分数位", + "halfStops": "1/2", + "thirdStops": "1/3", + "calibration": "校准", + "calibrationMessage": "此应用测量读数的准确性完全取决于设备的硬件。因此,请考虑测试此应用并手动设置 EV 校准,以获得准确的测量结果。", + "calibrationMessageCameraOnly": "此应用程序测量读数的准确性完全取决于设备的后置摄像头。因此,请考虑测试此应用并手动设置 EV 校准,以获得准确的测量结果。", + "camera": "摄像头", + "lightSensor": "光传感器", + "meteringScreenLayout": "布局", + "meteringScreenLayoutHint": "隐藏不需要的元素,以免浪费曝光列表空间", + "meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合", + "meteringScreenFeatureFilmPicker": "胶片选择", + "film": "胶片", + "equipment": "设备", + "equipmentProfileName": "设备配置名称", + "equipmentProfileNameHint": "Praktica MTL5B", + "equipmentProfileAllValues": "全部", + "apertureValues": "光圈值", + "apertureValuesFilterDescription": "选择要显示的光圈值范围。这通常由您使用的镜头决定。", + "ndFilters": "ND 滤镜", + "ndFiltersFilterDescription": "选择要显示的 ND 滤镜。这些可能是您最常用的 ND 滤镜,也可能是适合您镜头的滤光镜。", + "shutterSpeedValues": "快门速度", + "shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。这通常由您使用的相机机身决定。", + "isoValues": "ISO", + "isoValuesFilterDescription": "选择要显示的 ISO。这些值可能是您最常用的值,也可能是相机支持的值。", + "equipmentProfile": "设备配置", + "equipmentProfiles": "设备配置", + "general": "通用", + "keepScreenOn": "保持屏幕常亮", + "haptics": "震动", + "volumeKeysAction": "音量键快门", + "language": "语言", + "chooseLanguage": "选择语言", + "theme": "主题", + "chooseTheme": "选择主题", + "themeLight": "亮色", + "themeDark": "暗色", + "themeSystemDefault": "跟随系统", + "dynamicColor": "动态颜色", + "primaryColor": "主题颜色", + "choosePrimaryColor": "选择主题颜色", + "about": "关于", + "sourceCode": "源代码", + "reportIssue": "报告问题", + "writeEmail": "Email", + "youDontHaveMailApp": "您没有安装任何邮件App。", + "copyEmail": "复制电子邮件", + "version": "Version", + "versionNumber": "{version} ({buildNumber})", + "@versionNumber": { + "placeholders": { + "version": { + "type": "String" + }, + "buildNumber": { + "type": "String" + } + } + } +} From dd5f551fd2d35ba2c9c192a969caff43894a675e Mon Sep 17 00:00:00 2001 From: vodemn Date: Mon, 24 Jul 2023 07:54:38 +0000 Subject: [PATCH 04/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 222ac3c..cad178c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.12.0+31 +version: 0.12.1+32 environment: sdk: ">=3.0.0 <4.0.0" From b02b50bac349f2fa1c23e15b9739040948198edc Mon Sep 17 00:00:00 2001 From: ScaredCube <74418739+ScaredCube@users.noreply.github.com> Date: Mon, 24 Jul 2023 18:16:35 +0800 Subject: [PATCH 05/49] Fixed Chinese translation (#93) --- lib/l10n/intl_zh.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index b011254..b931906 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -25,8 +25,8 @@ "save": "保存", "settings": "设置", "metering": "测量", - "fractionalStops": "分数位", - "showFractionalStops": "显示分数位", + "fractionalStops": "EV 步进值", + "showFractionalStops": "显示 EV 步进值", "halfStops": "1/2", "thirdStops": "1/3", "calibration": "校准", @@ -46,7 +46,7 @@ "apertureValues": "光圈值", "apertureValuesFilterDescription": "选择要显示的光圈值范围。这通常由您使用的镜头决定。", "ndFilters": "ND 滤镜", - "ndFiltersFilterDescription": "选择要显示的 ND 滤镜。这些可能是您最常用的 ND 滤镜,也可能是适合您镜头的滤光镜。", + "ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。这些可能是您最常用的 ND 滤镜,也可能是适合您镜头的滤光镜。", "shutterSpeedValues": "快门速度", "shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。这通常由您使用的相机机身决定。", "isoValues": "ISO", From 119e079554016718e53a6b87a86d1fce5d238506 Mon Sep 17 00:00:00 2001 From: vodemn Date: Mon, 24 Jul 2023 11:04:23 +0000 Subject: [PATCH 06/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index cad178c..1f8ed64 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.12.1+32 +version: 0.12.2+33 environment: sdk: ">=3.0.0 <4.0.0" From 40c670ad3033809ca996456c353998aa6cab672f Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:31:01 +0200 Subject: [PATCH 07/49] Updated README Build section (#94) * Update README.md * Set exact Flutter version for workflows * Added stub `DefaultFirebaseOptions` * Fixed `rm` * Removed `rm` * Update .gitignore * Added readable name to ci workflow * Build -> Development * Update ci.yml --- .github/workflows/cd_dev.yml | 1 + .github/workflows/cd_prod.yml | 1 + .github/workflows/ci.yml | 30 ++++------------ README.md | 32 ++++++++++++++--- lib/firebase_options.dart | 68 +++++++++++++++++++++++++++++++++++ lib/main_prod.dart | 8 ++++- 6 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 lib/firebase_options.dart diff --git a/.github/workflows/cd_dev.yml b/.github/workflows/cd_dev.yml index d90d0fb..e0e6a25 100644 --- a/.github/workflows/cd_dev.yml +++ b/.github/workflows/cd_dev.yml @@ -71,6 +71,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: '3.10.0' - name: Prepare flutter project run: | diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/cd_prod.yml index 9ff3d6e..9e45644 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/cd_prod.yml @@ -73,6 +73,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: '3.10.0' - name: Prepare flutter project run: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8956f6..9022170 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,18 +12,12 @@ on: branches: ["main"] jobs: - build: + analyze_and_test: + name: Analyze & test runs-on: macos-11 timeout-minutes: 10 steps: - - uses: shaunco/ssh-agent@git-repo-mapping - with: - ssh-private-key: | - ${{ secrets.M3_LIGHTMETER_IAP_KEY }} - repo-mappings: | - github.com/vodemn/m3_lightmeter_iap - - uses: actions/checkout@v3 with: submodules: recursive @@ -31,23 +25,13 @@ jobs: - uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: '3.10.0' - - name: Check flutter version - run: flutter --version - - - name: Install dependencies - run: flutter pub get - - - name: Generate intl - run: flutter pub run intl_utils:generate - - - name: Restore firebase_options.dart - env: - FIREBASE_OPTIONS: ${{ secrets.FIREBASE_OPTIONS }} + - name: Prepare flutter project run: | - FIREBASE_OPTIONS_PATH=$RUNNER_TEMP/firebase_options.dart - echo -n "$FIREBASE_OPTIONS" | base64 --decode --output $FIREBASE_OPTIONS_PATH - cp $FIREBASE_OPTIONS_PATH ./lib + flutter --version + flutter pub get + flutter pub run intl_utils:generate - name: Analyze project source run: flutter analyze lib --fatal-infos diff --git a/README.md b/README.md index 0b4dae8..2fef498 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - [Table of contents](#table-of-contents) - [Backstory](#backstory) - [Screenshots](#screenshots) -- [Build](#build) +- [Development](#development) - [Contribution](#contribution) - [iOS Limitations](#ios-limitations) @@ -27,22 +27,46 @@ Without further delay behold my new Lightmeter app inspired by Material You (a.k

-# Build +# Development -As part of this project is private, you will be able to run this app from the _main_dev.dart_ file (i.e. --flavor dev). Also to avoid fatal errors the _main_prod.dart_ file is excluded from analysis. +### 1. Install Flutter + +To build this app you need to install Flutter 3.10.0 stable. [How to install](https://docs.flutter.dev/get-started/install). + +### 2. (Optional) Install Firebase + +Out of the box Firebase Crashlytics won't work. If you want to add Crashlytics to your local build please follow [this guide](https://firebase.google.com/docs/flutter/setup). + +### 3. Get packages + +Fetch all the neccessary dependencies and generate translation files by running the following commands: +```console +flutter pub get +flutter pub run intl_utils:generate +``` + +### 4. Build + +You can build an apk by running the following command from the root of the repository: +```console +flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=2/3 -t lib/main_$FLAVOR.dart +``` +Just replace `$FLAVOR` with `dev` or `prod`. # Contribution To report a bug or suggest a new feature open a new [issue](https://github.com/vodemn/m3_lightmeter/issues). -In case you want to help develop this project you need to follow this [style guide](doc/style_guide.md). +In case you want to help develop this project feel free to open a Pull Request, but you need to follow this [style guide](doc/style_guide.md). # iOS Limitations A list of features, that Android version of the app has and that iOS does not. ## Incident light metering + Apple does not provide API for reading Lux stream form the ambient light sensor. Lux can be calculated based on front camera image stream, but this would be a reflected light. So there is no way incident light metering can be implemented on iOS. ## Volume buttons action + This can be [implemented](https://stackoverflow.com/questions/70161271/ios-override-hardware-volume-buttons-same-as-zello) but the app will be rejected due to [2.5.9](https://developer.apple.com/app-store/review/guidelines/#software-requirements) \ No newline at end of file diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..a8a32c7 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,68 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + storageBucket: '', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + storageBucket: '', + iosClientId: '', + iosBundleId: '', + ); +} diff --git a/lib/main_prod.dart b/lib/main_prod.dart index a47d421..fc1700a 100644 --- a/lib/main_prod.dart +++ b/lib/main_prod.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:lightmeter/application.dart'; import 'package:lightmeter/environment.dart'; @@ -5,6 +7,10 @@ import 'package:lightmeter/firebase.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - await initializeFirebase(); + try { + await initializeFirebase(); + } catch (e) { + log(e.toString()); + } runApp(const Application(Environment.prod())); } From 6a9036ce5eed82cd312334ff698411bb85be6333 Mon Sep 17 00:00:00 2001 From: Vadim Date: Tue, 1 Aug 2023 12:58:43 +0200 Subject: [PATCH 08/49] Camera is taking too long to take a picture --- .../components/camera_container/bloc_container_camera.dart | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index cafce13..fee9899 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -129,6 +129,7 @@ class CameraContainerBloc extends EvSourceBlocBase([ _cameraController!.getMinZoomLevel(), diff --git a/pubspec.yaml b/pubspec.yaml index 1f8ed64..0015829 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: app_settings: 4.2.0 bloc_concurrency: 0.2.2 - camera: 0.10.5 + camera: 0.10.5+2 clipboard: 0.1.3 dynamic_color: 1.6.5 exif: 3.1.4 From 50c2460f16494b69fc60a9c2eea632ca2273cdd8 Mon Sep 17 00:00:00 2001 From: vodemn Date: Tue, 1 Aug 2023 11:08:55 +0000 Subject: [PATCH 09/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0015829..e2c7b6d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.12.2+33 +version: 0.12.3+34 environment: sdk: ">=3.0.0 <4.0.0" From c12cfb16976b69c19affc4f802852c936741f845 Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 3 Aug 2023 22:46:01 +0200 Subject: [PATCH 10/49] Lock & release focus when taking a picture --- .../components/camera_container/bloc_container_camera.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index fee9899..9c8658d 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -129,7 +129,6 @@ class CameraContainerBloc extends EvSourceBlocBase([ _cameraController!.getMinZoomLevel(), @@ -206,7 +205,13 @@ class CameraContainerBloc extends EvSourceBlocBase _takePhoto() async { try { + // https://github.com/flutter/flutter/issues/84957#issuecomment-1661155095 + await _cameraController!.setFocusMode(FocusMode.locked); + await _cameraController!.setExposureMode(ExposureMode.locked); final file = await _cameraController!.takePicture(); + await _cameraController!.setFocusMode(FocusMode.auto); + await _cameraController!.setExposureMode(ExposureMode.auto); + final Uint8List bytes = await file.readAsBytes(); Directory(file.path).deleteSync(recursive: true); From 6e1aaf5acf0d707d6853048d07cda87a037457c2 Mon Sep 17 00:00:00 2001 From: vodemn Date: Thu, 3 Aug 2023 20:54:33 +0000 Subject: [PATCH 11/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index e2c7b6d..315e72f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.12.3+34 +version: 0.12.4+35 environment: sdk: ">=3.0.0 <4.0.0" From 8a71c8db13dbbd6b380b36091ec8d27bd15bd0d9 Mon Sep 17 00:00:00 2001 From: Vadim Date: Fri, 4 Aug 2023 16:17:40 +0200 Subject: [PATCH 12/49] Added switch animations to `MeteringScreen` --- lib/res/dimens.dart | 1 + .../widget_placeholder_camera_view.dart | 5 +- .../widget_container_camera.dart | 26 ++-- .../widget_list_exposure_pairs.dart | 112 +++++++++--------- .../widget_container_reading_value.dart | 15 ++- 5 files changed, 82 insertions(+), 77 deletions(-) diff --git a/lib/res/dimens.dart b/lib/res/dimens.dart index 1eefdc1..a1bb780 100644 --- a/lib/res/dimens.dart +++ b/lib/res/dimens.dart @@ -25,6 +25,7 @@ class Dimens { static const Duration durationM = Duration(milliseconds: 200); static const Duration durationML = Duration(milliseconds: 250); static const Duration durationL = Duration(milliseconds: 300); + static const Duration switchDuration = Duration(milliseconds: 100); static const double enabledOpacity = 1.0; static const double disabledOpacity = 0.38; diff --git a/lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart b/lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart index 058da74..a2914d2 100644 --- a/lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart +++ b/lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart @@ -10,10 +10,9 @@ class CameraViewPlaceholder extends StatelessWidget { @override Widget build(BuildContext context) { return Card( + color: error != null ? null : Colors.black, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(Dimens.borderRadiusM)), - child: Center( - child: error != null ? const Icon(Icons.no_photography) : const CircularProgressIndicator(), - ), + child: Center(child: error != null ? const Icon(Icons.no_photography) : null), ); } } diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index 2f8ef45..7ac43eb 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -110,17 +110,17 @@ class _CameraViewBuilder extends StatelessWidget { return AspectRatio( aspectRatio: PlatformConfig.cameraPreviewAspectRatio, child: BlocBuilder( - buildWhen: (previous, current) => - current is CameraLoadingState || - current is CameraInitializedState || - current is CameraErrorState, - builder: (context, state) { - if (state is CameraInitializedState) { - return Center(child: CameraView(controller: state.controller)); - } else { - return CameraViewPlaceholder(error: state is CameraErrorState ? state.error : null); - } - }, + buildWhen: (previous, current) => current is! CameraActiveState, + builder: (context, state) => Center( + child: AnimatedSwitcher( + duration: Dimens.durationM, + child: switch (state) { + CameraInitializedState() => CameraView(controller: state.controller), + CameraErrorState() => CameraViewPlaceholder(error: state.error), + _ => const CameraViewPlaceholder(error: null), + }, + ), + ), ), ); } @@ -161,11 +161,11 @@ class _CameraControlsBuilder extends StatelessWidget { }, ); } else { - child = const SizedBox.shrink(); + child = const Column(children: [Expanded(child: SizedBox.shrink())],); } return AnimatedSwitcher( - duration: Dimens.durationS, + duration: Dimens.switchDuration, child: child, ); }, diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart index f2496b2..71b293e 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart @@ -12,70 +12,72 @@ class ExposurePairsList extends StatelessWidget { @override Widget build(BuildContext context) { - if (exposurePairs.isEmpty) { - return const EmptyExposurePairsList(); - } - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: ListView.builder( - key: ValueKey(exposurePairs.hashCode), - padding: const EdgeInsets.symmetric(vertical: Dimens.paddingL), - itemCount: exposurePairs.length, - itemBuilder: (_, index) => Stack( + return AnimatedSwitcher( + duration: Dimens.switchDuration, + child: exposurePairs.isEmpty + ? const EmptyExposurePairsList() + : Stack( alignment: Alignment.center, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: Alignment.centerLeft, - child: ExposurePairsListItem( - exposurePairs[index].aperture, - tickOnTheLeft: false, + Positioned.fill( + child: ListView.builder( + key: ValueKey(exposurePairs.hashCode), + padding: const EdgeInsets.symmetric(vertical: Dimens.paddingL), + itemCount: exposurePairs.length, + itemBuilder: (_, index) => Stack( + alignment: Alignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: ExposurePairsListItem( + exposurePairs[index].aperture, + tickOnTheLeft: false, + ), + ), + ), + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: ExposurePairsListItem( + exposurePairs[index].shutterSpeed, + tickOnTheLeft: true, + ), + ), + ), + ], ), - ), - ), - Expanded( - child: Align( - alignment: Alignment.centerLeft, - child: ExposurePairsListItem( - exposurePairs[index].shutterSpeed, - tickOnTheLeft: true, + Positioned( + top: 0, + bottom: 0, + child: LayoutBuilder( + builder: (context, constraints) => Align( + alignment: index == 0 + ? Alignment.bottomCenter + : (index == exposurePairs.length - 1 + ? Alignment.topCenter + : Alignment.center), + child: SizedBox( + height: index == 0 || index == exposurePairs.length - 1 + ? constraints.maxHeight / 2 + : constraints.maxHeight, + child: ColoredBox( + color: Theme.of(context).colorScheme.onBackground, + child: const SizedBox(width: 1), + ), + ), + ), + ), ), - ), - ), - ], - ), - Positioned( - top: 0, - bottom: 0, - child: LayoutBuilder( - builder: (context, constraints) => Align( - alignment: index == 0 - ? Alignment.bottomCenter - : (index == exposurePairs.length - 1 - ? Alignment.topCenter - : Alignment.center), - child: SizedBox( - height: index == 0 || index == exposurePairs.length - 1 - ? constraints.maxHeight / 2 - : constraints.maxHeight, - child: ColoredBox( - color: Theme.of(context).colorScheme.onBackground, - child: const SizedBox(width: 1), - ), - ), + ], ), ), ), ], ), - ), - ), - ], ); } } diff --git a/lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart b/lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart index b40f666..3254456 100644 --- a/lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart +++ b/lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart @@ -72,12 +72,15 @@ class _ReadingValueBuilder extends StatelessWidget { softWrap: false, ), const SizedBox(height: Dimens.grid4), - Text( - reading.value, - style: textTheme.titleMedium?.copyWith(color: textColor), - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, + AnimatedSwitcher( + duration: Dimens.switchDuration, + child: Text( + reading.value, + style: textTheme.titleMedium?.copyWith(color: textColor), + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + ), ) ], ); From 1310b78a54d85ba031577e8473f5de66098a6565 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sat, 5 Aug 2023 21:11:23 +0200 Subject: [PATCH 13/49] ML-61 Delete artefacts after release creation (#96) * Replaced "Build ..." flow with "Create new release" * Renamed other flows --- .../workflows/{cd_dev.yml => build_apk.yml} | 10 +-- .../{cd_prod.yml => create_release.yml} | 76 +++++++++++++++---- .github/workflows/{ci.yml => pr_check.yml} | 0 3 files changed, 62 insertions(+), 24 deletions(-) rename .github/workflows/{cd_dev.yml => build_apk.yml} (91%) rename .github/workflows/{cd_prod.yml => create_release.yml} (72%) rename .github/workflows/{ci.yml => pr_check.yml} (100%) diff --git a/.github/workflows/cd_dev.yml b/.github/workflows/build_apk.yml similarity index 91% rename from .github/workflows/cd_dev.yml rename to .github/workflows/build_apk.yml index e0e6a25..c972954 100644 --- a/.github/workflows/cd_dev.yml +++ b/.github/workflows/build_apk.yml @@ -19,17 +19,11 @@ on: jobs: build: + name: Build .apk runs-on: macos-11 - timeout-minutes: 30 + timeout-minutes: 15 steps: - # - uses: shaunco/ssh-agent@git-repo-mapping - # with: - # ssh-private-key: | - # ${{ secrets.M3_LIGHTMETER_IAP_KEY }} - # repo-mappings: | - # github.com/vodemn/m3_lightmeter_iap - - uses: actions/checkout@v3 with: submodules: recursive diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/create_release.yml similarity index 72% rename from .github/workflows/cd_prod.yml rename to .github/workflows/create_release.yml index 9e45644..6fe5d77 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/create_release.yml @@ -3,7 +3,9 @@ # separate terms of service, privacy policy, and support # documentation. -name: Build prod .aab & .apk +name: Create new release + +run-name: Release v${{ inputs.version }} on: workflow_dispatch: @@ -20,15 +22,9 @@ jobs: build: name: Build .apk & .aab runs-on: macos-11 - timeout-minutes: 30 - steps: - # - uses: shaunco/ssh-agent@git-repo-mapping - # with: - # ssh-private-key: | - # ${{ secrets.M3_LIGHTMETER_IAP_KEY }} - # repo-mappings: | - # github.com/vodemn/m3_lightmeter_iap + timeout-minutes: 15 + steps: - uses: actions/checkout@v3 with: submodules: recursive @@ -142,18 +138,66 @@ jobs: with: name: m3_lightmeter_apk + - name: Rename apk + run: mv app-prod-release.apk m3_lightmeter.apk + + - uses: ncipollo/release-action@v1.12.0 + with: + artifacts: "m3_lightmeter.apk" + skipIfReleaseExists: true + tag: "v${{ github.event.inputs.version }}" + + - name: Delete no longer used apk artifact + uses: geekyeggo/delete-artifact@v2 + with: + name: m3_lightmeter_apk + + extract-merged-native-libs: + name: Extract merged native libraries + needs: [build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Download app bundle uses: actions/download-artifact@v3 with: name: m3_lightmeter_bundle - - name: Rename artifacts + - name: Extract & zip merged_native_libs run: | - mv app-prod-release.apk m3_lightmeter.apk - mv app-prod-release.aab m3_lightmeter.aab + unzip app-prod-release.aab + (cd base/lib && zip -r "$OLDPWD/merged_native_libs.zip" .) - - uses: ncipollo/release-action@v1.12.0 + - name: Zip app bundle and merged_native_libs + run: zip m3_lightmeter_release.zip app-prod-release.aab merged_native_libs.zip + + - name: Upload merged_native_libs.zip to artifacts + uses: actions/upload-artifact@v3 with: - artifacts: "m3_lightmeter.apk, m3_lightmeter.aab" - skipIfReleaseExists: true - tag: "v${{ github.event.inputs.version }}" + name: m3_lightmeter_release + path: m3_lightmeter_release.zip + + # TODO: this should be moved to `create-google-play-release` step when it is implemented + - name: Delete no longer used app bundle artifact + uses: geekyeggo/delete-artifact@v2 + with: + name: m3_lightmeter_bundle + + # TODO: Automate Google Play releases creation + create-google-play-release: + if: false + name: Create Google Play release + needs: [build, extract-merged-native-libs] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Download app bundle + uses: actions/download-artifact@v3 + with: + name: m3_lightmeter_bundle diff --git a/.github/workflows/ci.yml b/.github/workflows/pr_check.yml similarity index 100% rename from .github/workflows/ci.yml rename to .github/workflows/pr_check.yml From 886188bb9e7997bbf0595be6a1b3cbef545f278d Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 6 Aug 2023 16:28:20 +0200 Subject: [PATCH 14/49] ML-95 Live histogram (#97) * Added histogram and separated camera view builder * Added histogram to `MeteringScreenLayoutConfig` * `ResolutionPreset.medium` -> `ResolutionPreset.low` * Adjusted histogram paddings --- .github/workflows/build_apk.yml | 2 +- .github/workflows/create_release.yml | 2 +- .vscode/launch.json | 4 +- .vscode/tasks.json | 6 +- README.md | 4 +- .../models/metering_screen_layout_config.dart | 10 +- lib/data/shared_prefs_service.dart | 1 + lib/l10n/intl_en.arb | 1 + lib/l10n/intl_fr.arb | 1 + lib/l10n/intl_ru.arb | 1 + lib/l10n/intl_zh.arb | 1 + .../bloc_container_camera.dart | 2 +- .../camera_view/widget_camera_view.dart | 10 +- .../widget_placeholder_camera_view.dart | 0 .../histogram/widget_histogram.dart | 132 ++++++++++++++++++ .../camera_preview/widget_camera_preview.dart | 62 ++++++++ .../widget_container_camera.dart | 26 ++-- ...ialog_metering_screen_layout_features.dart | 2 + .../metering_screen_layout_config_test.dart | 60 +++++--- test/data/shared_prefs_service_test.dart | 7 +- 20 files changed, 280 insertions(+), 54 deletions(-) rename lib/screens/metering/components/camera_container/components/{ => camera_preview/components}/camera_view/widget_camera_view.dart (86%) rename lib/screens/metering/components/camera_container/components/{ => camera_preview/components}/camera_view_placeholder/widget_placeholder_camera_view.dart (100%) create mode 100644 lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart create mode 100644 lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart diff --git a/.github/workflows/build_apk.yml b/.github/workflows/build_apk.yml index c972954..9157f90 100644 --- a/.github/workflows/build_apk.yml +++ b/.github/workflows/build_apk.yml @@ -76,7 +76,7 @@ jobs: - name: Build Apk env: FLAVOR: ${{ github.event.inputs.flavor }} - run: flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=2/3 -t lib/main_$FLAVOR.dart + run: flutter build apk --release --flavor $FLAVOR --dart-define c -t lib/main_$FLAVOR.dart - name: Upload artifact uses: actions/upload-artifact@v3 diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 6fe5d77..3851170 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ on: type: string env: - BUILD_ARGS: --release --flavor prod --dart-define cameraPreviewAspectRatio=2/3 -t lib/main_prod.dart + BUILD_ARGS: --release --flavor prod --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_prod.dart jobs: build: diff --git a/.vscode/launch.json b/.vscode/launch.json index fb960be..822d34d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,7 @@ "--flavor", "dev", "--dart-define", - "cameraPreviewAspectRatio=2/3", + "cameraPreviewAspectRatio=240/320", ], "program": "${workspaceFolder}/lib/main_dev.dart", }, @@ -36,7 +36,7 @@ "--flavor", "prod", "--dart-define", - "cameraPreviewAspectRatio=2/3", + "cameraPreviewAspectRatio=240/320", ], "program": "${workspaceFolder}/lib/main_prod.dart", }, diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 8615437..adaac0f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,7 +12,7 @@ "dev", "--release", "--dart-define", - "cameraPreviewAspectRatio=2/3", + "cameraPreviewAspectRatio=240/320", "-t", "lib/main_dev.dart", ], @@ -28,7 +28,7 @@ "prod", "--release", "--dart-define", - "cameraPreviewAspectRatio=2/3", + "cameraPreviewAspectRatio=240/320", "-t", "lib/main_prod.dart", ], @@ -44,7 +44,7 @@ "prod", "--release", "--dart-define", - "cameraPreviewAspectRatio=2/3", + "cameraPreviewAspectRatio=240/320", "-t", "lib/main_prod.dart", ], diff --git a/README.md b/README.md index 2fef498..f629aa2 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,11 @@ flutter pub get flutter pub run intl_utils:generate ``` -### 4. Build +### 4. Build (Android) You can build an apk by running the following command from the root of the repository: ```console -flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=2/3 -t lib/main_$FLAVOR.dart +flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_$FLAVOR.dart ``` Just replace `$FLAVOR` with `dev` or `prod`. diff --git a/lib/data/models/metering_screen_layout_config.dart b/lib/data/models/metering_screen_layout_config.dart index 3410632..0aae055 100644 --- a/lib/data/models/metering_screen_layout_config.dart +++ b/lib/data/models/metering_screen_layout_config.dart @@ -1,11 +1,13 @@ -enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker } +enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker, histogram } typedef MeteringScreenLayoutConfig = Map; extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig { - static MeteringScreenLayoutConfig fromJson(Map data) => data.map( - (key, value) => MapEntry(MeteringScreenLayoutFeature.values[int.parse(key)], value as bool), - ); + static MeteringScreenLayoutConfig fromJson(Map data) => + { + for (final f in MeteringScreenLayoutFeature.values) + f: data[f.index.toString()] as bool? ?? true + }; Map toJson() => map((key, value) => MapEntry(key.index.toString(), value)); } diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart index 8105d5c..8ae5487 100644 --- a/lib/data/shared_prefs_service.dart +++ b/lib/data/shared_prefs_service.dart @@ -97,6 +97,7 @@ class UserPreferencesService { return { MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, + MeteringScreenLayoutFeature.histogram: true, }; } } diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 39700b8..1bfe8ed 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -38,6 +38,7 @@ "meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.", "meteringScreenFeatureExtremeExposurePairs": "Fastest & shortest exposure pairs", "meteringScreenFeatureFilmPicker": "Film picker", + "meteringScreenFeatureHistogram": "Histogram", "film": "Film", "equipment": "Equipment", "equipmentProfileName": "Equipment profile name", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 5957d0d..f75d76b 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -38,6 +38,7 @@ "meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.", "meteringScreenFeatureExtremeExposurePairs": "Paires d'exposition les plus rapides et les plus courtes", "meteringScreenFeatureFilmPicker": "Sélecteur de film", + "meteringScreenFeatureHistogram": "Histogramme", "film": "Pellicule", "equipment": "Équipement", "equipmentProfileName": "Nom du profil de l'équipement", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index f6b3833..3a67fc2 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -38,6 +38,7 @@ "meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.", "meteringScreenFeatureExtremeExposurePairs": "Длинная и короткая выдержки", "meteringScreenFeatureFilmPicker": "Выбор пленки", + "meteringScreenFeatureHistogram": "Гистограмма", "film": "Пленка", "equipment": "Оборудование", "equipmentProfileName": "Название профиля", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index b931906..5d020cf 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -38,6 +38,7 @@ "meteringScreenLayoutHint": "隐藏不需要的元素,以免浪费曝光列表空间", "meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合", "meteringScreenFeatureFilmPicker": "胶片选择", + "meteringScreenFeatureHistogram": "直方图", "film": "胶片", "equipment": "设备", "equipmentProfileName": "设备配置名称", diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index 9c8658d..991bdf6 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -123,7 +123,7 @@ class CameraContainerBloc extends EvSourceBlocBase camera.lensDirection == CameraLensDirection.back, orElse: () => cameras.last, ), - ResolutionPreset.medium, + ResolutionPreset.low, enableAudio: false, ); diff --git a/lib/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart b/lib/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart similarity index 86% rename from lib/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart rename to lib/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart index e443ad1..7c06062 100644 --- a/lib/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart @@ -14,10 +14,12 @@ class CameraView extends StatelessWidget { valueListenable: controller, builder: (_, __, ___) => AspectRatio( aspectRatio: _isLandscape(value) ? value.aspectRatio : (1 / value.aspectRatio), - child: RotatedBox( - quarterTurns: _getQuarterTurns(value), - child: controller.buildPreview(), - ), + child: value.isInitialized + ? RotatedBox( + quarterTurns: _getQuarterTurns(value), + child: controller.buildPreview(), + ) + : const SizedBox.shrink(), ), ); } diff --git a/lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart b/lib/screens/metering/components/camera_container/components/camera_preview/components/camera_view_placeholder/widget_placeholder_camera_view.dart similarity index 100% rename from lib/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart rename to lib/screens/metering/components/camera_container/components/camera_preview/components/camera_view_placeholder/widget_placeholder_camera_view.dart diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart b/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart new file mode 100644 index 0000000..6964e77 --- /dev/null +++ b/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart @@ -0,0 +1,132 @@ +import 'dart:math'; + +import 'package:camera/camera.dart'; +import 'package:flutter/material.dart'; +import 'package:lightmeter/res/dimens.dart'; + +class CameraHistogram extends StatefulWidget { + final CameraController controller; + + const CameraHistogram({required this.controller, super.key}); + + @override + _CameraHistogramState createState() => _CameraHistogramState(); +} + +class _CameraHistogramState extends State { + List histogramR = List.filled(256, 0); + List histogramG = List.filled(256, 0); + List histogramB = List.filled(256, 0); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _startImageStream(); + }); + } + + @override + void dispose() { + widget.controller.stopImageStream(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + HistogramChannel( + color: Colors.red, + values: histogramR, + ), + const SizedBox(height: Dimens.grid4), + HistogramChannel( + color: Colors.green, + values: histogramG, + ), + const SizedBox(height: Dimens.grid4), + HistogramChannel( + color: Colors.blue, + values: histogramB, + ), + ], + ); + } + + void _startImageStream() { + widget.controller.startImageStream((CameraImage image) { + histogramR = List.filled(256, 0); + histogramG = List.filled(256, 0); + histogramB = List.filled(256, 0); + + final int uvRowStride = image.planes[1].bytesPerRow; + final int uvPixelStride = image.planes[1].bytesPerPixel!; + + for (int x = 0; x < image.width; x++) { + for (int y = 0; y < image.height; y++) { + final int uvIndex = uvPixelStride * (x / 2).floor() + uvRowStride * (y / 2).floor(); + final int index = y * image.width + x; + + final yp = image.planes[0].bytes[index]; + final up = image.planes[1].bytes[uvIndex]; + final vp = image.planes[2].bytes[uvIndex]; + + final r = yp + vp * 1436 / 1024 - 179; + final g = yp - up * 46549 / 131072 + 44 - vp * 93604 / 131072 + 91; + final b = yp + up * 1814 / 1024 - 227; + + histogramR[r.round().clamp(0, 255)]++; + histogramG[g.round().clamp(0, 255)]++; + histogramB[b.round().clamp(0, 255)]++; + } + } + + if (mounted) setState(() {}); + }); + } +} + +class HistogramChannel extends StatelessWidget { + final List values; + final Color color; + + final int _maxOccurences; + + HistogramChannel({ + required this.values, + required this.color, + super.key, + }) : _maxOccurences = values.reduce((value, element) => max(value, element)); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final pixelWidth = constraints.maxWidth / values.length; + return Column( + children: [ + SizedBox( + height: Dimens.grid16, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: values + .map( + (e) => SizedBox( + height: _maxOccurences == 0 ? 0 : Dimens.grid16 * (e / _maxOccurences), + width: pixelWidth, + child: ColoredBox(color: color), + ), + ) + .toList(), + ), + ), + const Divider(), + ], + ); + }, + ); + } +} diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart new file mode 100644 index 0000000..288c678 --- /dev/null +++ b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart @@ -0,0 +1,62 @@ +import 'package:camera/camera.dart'; +import 'package:flutter/material.dart'; +import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; +import 'package:lightmeter/platform_config.dart'; +import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/res/dimens.dart'; +import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart'; +import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view_placeholder/widget_placeholder_camera_view.dart'; +import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart'; +import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart'; + +class CameraPreview extends StatefulWidget { + final CameraController? controller; + final CameraErrorType? error; + + const CameraPreview({this.controller, this.error, super.key}); + + @override + State createState() => _CameraPreviewState(); +} + +class _CameraPreviewState extends State { + @override + Widget build(BuildContext context) { + return AspectRatio( + aspectRatio: PlatformConfig.cameraPreviewAspectRatio, + child: Center( + child: Stack( + children: [ + const CameraViewPlaceholder(error: null), + AnimatedSwitcher( + duration: Dimens.switchDuration, + child: widget.controller != null + ? ValueListenableBuilder( + valueListenable: widget.controller!, + builder: (_, __, ___) => widget.controller!.value.isInitialized + ? Stack( + alignment: Alignment.bottomCenter, + children: [ + CameraView(controller: widget.controller!), + if (MeteringScreenLayout.featureOf( + context, + MeteringScreenLayoutFeature.histogram, + )) + Positioned( + left: Dimens.grid8, + right: Dimens.grid8, + bottom: Dimens.grid16, + child: CameraHistogram(controller: widget.controller!), + ), + ], + ) + : const SizedBox.shrink(), + ) + : CameraViewPlaceholder(error: widget.error), + ), + ], + ), + ), + ); + } +} diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index 7ac43eb..a8f0a11 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -10,8 +10,7 @@ import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls/widget_camera_controls.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart'; -import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart'; -import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart'; +import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart'; import 'package:lightmeter/screens/metering/components/camera_container/event_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart'; import 'package:lightmeter/screens/metering/components/camera_container/state_container_camera.dart'; @@ -107,20 +106,11 @@ class _CameraViewBuilder extends StatelessWidget { @override Widget build(BuildContext context) { - return AspectRatio( - aspectRatio: PlatformConfig.cameraPreviewAspectRatio, - child: BlocBuilder( - buildWhen: (previous, current) => current is! CameraActiveState, - builder: (context, state) => Center( - child: AnimatedSwitcher( - duration: Dimens.durationM, - child: switch (state) { - CameraInitializedState() => CameraView(controller: state.controller), - CameraErrorState() => CameraViewPlaceholder(error: state.error), - _ => const CameraViewPlaceholder(error: null), - }, - ), - ), + return BlocBuilder( + buildWhen: (previous, current) => current is! CameraActiveState, + builder: (context, state) => CameraPreview( + controller: state is CameraInitializedState ? state.controller : null, + error: state is CameraErrorState ? state.error : null, ), ); } @@ -161,7 +151,9 @@ class _CameraControlsBuilder extends StatelessWidget { }, ); } else { - child = const Column(children: [Expanded(child: SizedBox.shrink())],); + child = const Column( + children: [Expanded(child: SizedBox.shrink())], + ); } return AnimatedSwitcher( diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart index 654a6c4..d43f011 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart @@ -71,6 +71,8 @@ class _MeteringScreenLayoutFeaturesDialogState extends State sharedPreferences.setString( UserPreferencesService.meteringScreenLayoutKey, - """{"0":false,"1":true}""", + """{"0":false,"1":true,"2":true}""", ), ).thenAnswer((_) => Future.value(true)); service.meteringScreenLayout = { MeteringScreenLayoutFeature.extremeExposurePairs: false, MeteringScreenLayoutFeature.filmPicker: true, + MeteringScreenLayoutFeature.histogram: true, }; verify( () => sharedPreferences.setString( UserPreferencesService.meteringScreenLayoutKey, - """{"0":false,"1":true}""", + """{"0":false,"1":true,"2":true}""", ), ).called(1); }); From 737a9aa2c252202264118024475cbf82f16a663b Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Mon, 7 Aug 2023 12:56:29 +0200 Subject: [PATCH 15/49] ML-98 Metering top bar cutout doesn't pass through taps (#99) * replaced `OverflowBox` with `Stack` --- .../widget_container_camera.dart | 155 +++++++++--------- 1 file changed, 76 insertions(+), 79 deletions(-) diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index a8f0a11..e42991c 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; @@ -45,59 +47,94 @@ class CameraContainer extends StatelessWidget { @override Widget build(BuildContext context) { - final double cameraViewHeight = - ((MediaQuery.of(context).size.width - Dimens.grid8 - 2 * Dimens.paddingM) / 2) / - PlatformConfig.cameraPreviewAspectRatio; + final double meteringContainerHeight = _meteringContainerHeight(context); + final double cameraPreviewHeight = _cameraPreviewHeight(context); + final double topBarOverflow = meteringContainerHeight - cameraPreviewHeight; - double topBarOverflow = Dimens.readingContainerSingleValueHeight + // ISO & ND - -cameraViewHeight; + return Stack( + children: [ + Positioned( + left: 0, + top: 0, + right: 0, + child: MeteringTopBar( + readingsContainer: ReadingsContainer( + fastest: fastest, + slowest: slowest, + film: film, + iso: iso, + nd: nd, + onFilmChanged: onFilmChanged, + onIsoChanged: onIsoChanged, + onNdChanged: onNdChanged, + ), + appendixHeight: topBarOverflow, + preview: const _CameraViewBuilder(), + ), + ), + SafeArea( + bottom: false, + child: Column( + children: [ + SizedBox( + height: min(meteringContainerHeight, cameraPreviewHeight) + Dimens.paddingM * 2, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + child: Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(top: topBarOverflow >= 0 ? topBarOverflow : 0), + child: ExposurePairsList(exposurePairs), + ), + ), + const SizedBox(width: Dimens.grid8), + Expanded( + child: Padding( + padding: EdgeInsets.only(top: topBarOverflow <= 0 ? -topBarOverflow : 0), + child: const _CameraControlsBuilder(), + ), + ), + ], + ), + ), + ), + ], + ), + ) + ], + ); + } + + double _meteringContainerHeight(BuildContext context) { + double enabledFeaturesHeight = 0; if (FeaturesConfig.equipmentProfilesEnabled) { - topBarOverflow += Dimens.readingContainerSingleValueHeight; - topBarOverflow += Dimens.paddingS; + enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight; + enabledFeaturesHeight += Dimens.paddingS; } if (MeteringScreenLayout.featureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) { - topBarOverflow += Dimens.readingContainerDoubleValueHeight; - topBarOverflow += Dimens.paddingS; + enabledFeaturesHeight += Dimens.readingContainerDoubleValueHeight; + enabledFeaturesHeight += Dimens.paddingS; } if (MeteringScreenLayout.featureOf( context, MeteringScreenLayoutFeature.filmPicker, )) { - topBarOverflow += Dimens.readingContainerSingleValueHeight; - topBarOverflow += Dimens.paddingS; + enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight; + enabledFeaturesHeight += Dimens.paddingS; } - return Column( - children: [ - MeteringTopBar( - readingsContainer: ReadingsContainer( - fastest: fastest, - slowest: slowest, - film: film, - iso: iso, - nd: nd, - onFilmChanged: onFilmChanged, - onIsoChanged: onIsoChanged, - onNdChanged: onNdChanged, - ), - appendixHeight: topBarOverflow, - preview: const _CameraViewBuilder(), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), - child: _MiddleContentWrapper( - topBarOverflow: topBarOverflow, - leftContent: ExposurePairsList(exposurePairs), - rightContent: const _CameraControlsBuilder(), - ), - ), - ), - ], - ); + return enabledFeaturesHeight + Dimens.readingContainerSingleValueHeight; // ISO & ND + } + + double _cameraPreviewHeight(BuildContext context) { + return ((MediaQuery.of(context).size.width - Dimens.grid8 - 2 * Dimens.paddingM) / 2) / + PlatformConfig.cameraPreviewAspectRatio; } } @@ -165,43 +202,3 @@ class _CameraControlsBuilder extends StatelessWidget { ); } } - -class _MiddleContentWrapper extends StatelessWidget { - final double topBarOverflow; - final Widget leftContent; - final Widget rightContent; - - const _MiddleContentWrapper({ - required this.topBarOverflow, - required this.leftContent, - required this.rightContent, - }); - - @override - Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) => OverflowBox( - alignment: Alignment.bottomCenter, - maxHeight: constraints.maxHeight + topBarOverflow.abs(), - maxWidth: constraints.maxWidth, - child: Row( - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(top: topBarOverflow >= 0 ? topBarOverflow : 0), - child: leftContent, - ), - ), - const SizedBox(width: Dimens.grid8), - Expanded( - child: Padding( - padding: EdgeInsets.only(top: topBarOverflow <= 0 ? -topBarOverflow : 0), - child: rightContent, - ), - ), - ], - ), - ), - ); - } -} From 9c11401175c344d5d69f5adfaf0e7eea4b25b558 Mon Sep 17 00:00:00 2001 From: vodemn Date: Mon, 7 Aug 2023 14:59:47 +0000 Subject: [PATCH 16/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 315e72f..7a4c862 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.12.4+35 +version: 0.13.0+36 environment: sdk: ">=3.0.0 <4.0.0" From d91441bac9ab5bed8abc073521a012b8a95e6ed7 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:46:43 +0200 Subject: [PATCH 17/49] ML-95 Live histogram (#100) * Removed redundant `stopImageStream()` --- .../camera_preview/components/histogram/widget_histogram.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart b/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart index 6964e77..05dfa9d 100644 --- a/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/components/histogram/widget_histogram.dart @@ -28,7 +28,9 @@ class _CameraHistogramState extends State { @override void dispose() { - widget.controller.stopImageStream(); + /// There is no need to stop image stream here, + /// because this widget will be disposed when CameraController is disposed + /// widget.controller.stopImageStream(); super.dispose(); } From b9412c7441f8bc68ef02071dc113bb1deaa470a6 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:24:12 +0200 Subject: [PATCH 18/49] ML-61 Create Google Play release from Github actions (#101) * Delete all artefacts after GP release * Update create_release.yml * Added release notes formatting * Preserve release zip if GP release creation failed * Create whatsnew folder --- .github/workflows/create_release.yml | 118 ++++++++++++++++++++------- 1 file changed, 87 insertions(+), 31 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 3851170..ca00c25 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -3,6 +3,11 @@ # separate terms of service, privacy policy, and support # documentation. + +# This workflow uses perl regex. For better syntaxis understading see these docs: +# https://perldoc.perl.org/perlrequick#Search-and-replace +# https://perldoc.perl.org/perlre#Other-Modifiers + name: Create new release run-name: Release v${{ inputs.version }} @@ -14,6 +19,10 @@ on: description: "Version" required: true type: string + release-notes: + description: "Release notes" + required: true + type: string env: BUILD_ARGS: --release --flavor prod --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_prod.dart @@ -23,7 +32,6 @@ jobs: name: Build .apk & .aab runs-on: macos-11 timeout-minutes: 15 - steps: - uses: actions/checkout@v3 with: @@ -95,6 +103,21 @@ jobs: name: m3_lightmeter_bundle path: build/app/outputs/bundle/prodRelease/app-prod-release.aab + generate-release-notes: + name: Generate release notes + runs-on: ubuntu-latest + steps: + - name: Generate release notes + run: | + echo ${{ inputs.release-notes }} > whatsnew-en-US.md + perl -i -pe 's/\s{1}(-{1})/\n$1/g' whatsnew-en-US.md + + - name: Upload merged_native_libs.zip to artifacts + uses: actions/upload-artifact@v3 + with: + name: whatsnew-en-US + path: whatsnew-en-US.md + update-version-in-repo: name: Update repo version needs: [build] @@ -121,22 +144,20 @@ jobs: branch: ${{ github.ref_name }} unprotect_reviews: true - create-release: + create-github-release: name: Create Github release - needs: [build, update-version-in-repo] if: github.ref_name == 'main' + needs: [generate-release-notes, update-version-in-repo] runs-on: ubuntu-latest permissions: contents: write steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Download apk + - name: Download apk & release notes uses: actions/download-artifact@v3 with: - name: m3_lightmeter_apk + name: | + m3_lightmeter_apk + whatsnew-en-US - name: Rename apk run: mv app-prod-release.apk m3_lightmeter.apk @@ -146,8 +167,9 @@ jobs: artifacts: "m3_lightmeter.apk" skipIfReleaseExists: true tag: "v${{ github.event.inputs.version }}" + bodyFile: "whatsnew-en-US.md" - - name: Delete no longer used apk artifact + - name: Delete apk artifact uses: geekyeggo/delete-artifact@v2 with: name: m3_lightmeter_apk @@ -157,10 +179,6 @@ jobs: needs: [build] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - name: Download app bundle uses: actions/download-artifact@v3 with: @@ -171,33 +189,71 @@ jobs: unzip app-prod-release.aab (cd base/lib && zip -r "$OLDPWD/merged_native_libs.zip" .) + - name: Upload merged native libs to artifacts + uses: actions/upload-artifact@v3 + with: + name: merged_native_libs + path: merged_native_libs.zip + + create-google-play-release: + name: Create Google Play release + if: github.ref_name == 'main' + needs: [generate-release-notes, extract-merged-native-libs] + runs-on: ubuntu-latest + steps: + - name: Download app bundle & merged native libs + uses: actions/download-artifact@v3 + with: + name: | + m3_lightmeter_bundle + merged_native_libs + whatsnew-en-US + + - name: Move release notes to a folder + run: | + mkdir whatsnew + mv whatsnew-en-US.md whatsnew + + - name: Create Google Play release + id: create-google-play-release-step + uses: r0adkll/upload-google-play@v1.1.1 + with: + serviceAccountJsonPlainText: ${{ secrets.GH_ACTIONS_SERVICE_ACCOUNT_JSON }} + packageName: com.vodemn.lightmeter + releaseFiles: app-prod-release.aab + track: production + status: draft + userFraction: 1.0 + debugSymbols: merged_native_libs.zip + whatsNewDirectory: whatsnew + + # https://docs.github.com/en/actions/learn-github-actions/expressions#failure-with-conditions - name: Zip app bundle and merged_native_libs + if: ${{ failure() && steps.create-google-play-release-step.conclusion == 'failure' }} run: zip m3_lightmeter_release.zip app-prod-release.aab merged_native_libs.zip - - name: Upload merged_native_libs.zip to artifacts + - name: Upload release zip to artifacts + if: ${{ failure() && steps.create-google-play-release-step.conclusion == 'failure' }} uses: actions/upload-artifact@v3 with: name: m3_lightmeter_release path: m3_lightmeter_release.zip - - # TODO: this should be moved to `create-google-play-release` step when it is implemented - - name: Delete no longer used app bundle artifact + + - name: Delete app bundle & merged native libs artifacts + if: ${{ always() }} uses: geekyeggo/delete-artifact@v2 with: - name: m3_lightmeter_bundle + name: | + m3_lightmeter_bundle + merged_native_libs - # TODO: Automate Google Play releases creation - create-google-play-release: - if: false - name: Create Google Play release - needs: [build, extract-merged-native-libs] + cleanup: + name: Cleanup + if: ${{ always() }} + needs: [create-github-release, create-google-play-release] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Delete release notes artifact + uses: geekyeggo/delete-artifact@v2 with: - submodules: recursive - - - name: Download app bundle - uses: actions/download-artifact@v3 - with: - name: m3_lightmeter_bundle + name: whatsnew-en-US From d41fa6fa8494ecd016f511bfbf782e5c345d4c48 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 9 Aug 2023 16:39:41 +0200 Subject: [PATCH 19/49] ML-61 Download each artifact separately (#102) * Download each artifact separately * typo * Updated setup-java action * Extract merged native libs directly in GP release job --- .github/workflows/create_release.yml | 45 ++++++++++------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index ca00c25..71248ac 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -37,7 +37,7 @@ jobs: with: submodules: recursive - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: "zulu" java-version: "11" @@ -152,16 +152,19 @@ jobs: permissions: contents: write steps: - - name: Download apk & release notes + - name: Download apk uses: actions/download-artifact@v3 with: - name: | - m3_lightmeter_apk - whatsnew-en-US + name: m3_lightmeter_apk - name: Rename apk run: mv app-prod-release.apk m3_lightmeter.apk + - name: Download release notes + uses: actions/download-artifact@v3 + with: + name: whatsnew-en-US + - uses: ncipollo/release-action@v1.12.0 with: artifacts: "m3_lightmeter.apk" @@ -174,9 +177,10 @@ jobs: with: name: m3_lightmeter_apk - extract-merged-native-libs: - name: Extract merged native libraries - needs: [build] + create-google-play-release: + name: Create Google Play release + if: github.ref_name == 'main' + needs: [generate-release-notes] runs-on: ubuntu-latest steps: - name: Download app bundle @@ -189,31 +193,16 @@ jobs: unzip app-prod-release.aab (cd base/lib && zip -r "$OLDPWD/merged_native_libs.zip" .) - - name: Upload merged native libs to artifacts - uses: actions/upload-artifact@v3 - with: - name: merged_native_libs - path: merged_native_libs.zip - - create-google-play-release: - name: Create Google Play release - if: github.ref_name == 'main' - needs: [generate-release-notes, extract-merged-native-libs] - runs-on: ubuntu-latest - steps: - - name: Download app bundle & merged native libs + - name: Download release notes uses: actions/download-artifact@v3 with: - name: | - m3_lightmeter_bundle - merged_native_libs - whatsnew-en-US + name: whatsnew-en-US - name: Move release notes to a folder run: | mkdir whatsnew mv whatsnew-en-US.md whatsnew - + - name: Create Google Play release id: create-google-play-release-step uses: r0adkll/upload-google-play@v1.1.1 @@ -243,9 +232,7 @@ jobs: if: ${{ always() }} uses: geekyeggo/delete-artifact@v2 with: - name: | - m3_lightmeter_bundle - merged_native_libs + name: m3_lightmeter_bundle cleanup: name: Cleanup From bdb0442dd104d59c996538e3d3b1fddc9c05e4e5 Mon Sep 17 00:00:00 2001 From: Vadim Date: Wed, 9 Aug 2023 16:49:02 +0200 Subject: [PATCH 20/49] Fixed release jobs dependencies --- .github/workflows/create_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 71248ac..693b3fd 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -147,7 +147,7 @@ jobs: create-github-release: name: Create Github release if: github.ref_name == 'main' - needs: [generate-release-notes, update-version-in-repo] + needs: [build, generate-release-notes, update-version-in-repo] runs-on: ubuntu-latest permissions: contents: write @@ -180,7 +180,7 @@ jobs: create-google-play-release: name: Create Google Play release if: github.ref_name == 'main' - needs: [generate-release-notes] + needs: [build, generate-release-notes] runs-on: ubuntu-latest steps: - name: Download app bundle From dafbc682886ee8fac129fbdbb568af950f54cce9 Mon Sep 17 00:00:00 2001 From: Vadim Date: Wed, 9 Aug 2023 17:06:47 +0200 Subject: [PATCH 21/49] Increased build job timeout --- .github/workflows/create_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 693b3fd..5f8191e 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -31,7 +31,7 @@ jobs: build: name: Build .apk & .aab runs-on: macos-11 - timeout-minutes: 15 + timeout-minutes: 30 steps: - uses: actions/checkout@v3 with: From 6e3588a72e9af0e48141f2b80f91285923063b2b Mon Sep 17 00:00:00 2001 From: vodemn Date: Wed, 9 Aug 2023 15:20:00 +0000 Subject: [PATCH 22/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 7a4c862..7f4fcb5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.13.0+36 +version: 0.13.1+37 environment: sdk: ">=3.0.0 <4.0.0" From 4917ee8aefaef71bbfa6a69ab21ebeaa8b47725b Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Thu, 10 Aug 2023 12:42:31 +0200 Subject: [PATCH 23/49] ML-61 Try to automate GP & Github releases via Github Actions (#103) * Added option to create separate releases * Removed branch condition * Added default values to releases checkboxes * Removed user fraction * Remove .md extension for GP release * More refined releases conditions * Parse release name * Create Google Play release name * Checkout first * Update create_release.yml * Increment build number only for GH release * Release with status `complete` * typo --- .github/workflows/create_release.yml | 40 ++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 5f8191e..07f76c8 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -23,6 +23,14 @@ on: description: "Release notes" required: true type: string + github-release: + type: boolean + description: Create Github release + default: true + google-play-release: + type: boolean + description: Create Google Play release + default: true env: BUILD_ARGS: --release --flavor prod --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_prod.dart @@ -30,6 +38,7 @@ env: jobs: build: name: Build .apk & .aab + if: ${{ inputs.github-release }} || ${{ inputs.google-play-release }} runs-on: macos-11 timeout-minutes: 30 steps: @@ -70,7 +79,10 @@ jobs: echo -n "$FIREBASE_OPTIONS" | base64 --decode --output $FIREBASE_OPTIONS_PATH cp $FIREBASE_OPTIONS_PATH ./lib + # This step makes sense when Github release is enabled because this release increments the build number. + # Therefore here we have to increment it as well to build an apk with the same build number. - name: Increment build number & replace version number + if: ${{ inputs.github-release }} run: perl -i -pe 's/^(version:\s+)(\d+\.\d+\.\d+)(\+)(\d+)$/$1."${{ github.event.inputs.version }}".$3.($4+1)/e' pubspec.yaml - name: Install Flutter @@ -86,18 +98,22 @@ jobs: flutter pub run intl_utils:generate - name: Build apk + if: ${{ inputs.github-release }} run: flutter build apk $BUILD_ARGS - name: Upload apk to artifacts + if: ${{ inputs.github-release }} uses: actions/upload-artifact@v3 with: name: m3_lightmeter_apk path: build/app/outputs/flutter-apk/app-prod-release.apk - name: Build appbundle + if: ${{ inputs.google-play-release }} run: flutter build appbundle $BUILD_ARGS - name: Upload app bundle to artifacts + if: ${{ inputs.google-play-release }} uses: actions/upload-artifact@v3 with: name: m3_lightmeter_bundle @@ -120,6 +136,7 @@ jobs: update-version-in-repo: name: Update repo version + if: ${{ inputs.github-release }} needs: [build] runs-on: ubuntu-latest steps: @@ -146,7 +163,7 @@ jobs: create-github-release: name: Create Github release - if: github.ref_name == 'main' + if: ${{ inputs.github-release }} needs: [build, generate-release-notes, update-version-in-repo] runs-on: ubuntu-latest permissions: @@ -179,10 +196,14 @@ jobs: create-google-play-release: name: Create Google Play release - if: github.ref_name == 'main' + if: ${{ inputs.google-play-release }} needs: [build, generate-release-notes] runs-on: ubuntu-latest steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Download app bundle uses: actions/download-artifact@v3 with: @@ -200,8 +221,17 @@ jobs: - name: Move release notes to a folder run: | + mv whatsnew-en-US.md whatsnew-en-US mkdir whatsnew - mv whatsnew-en-US.md whatsnew + mv whatsnew-en-US whatsnew + + # https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match' + # https://stackoverflow.com/questions/74353311/github-workflow-unable-to-process-file-command-env-successfully + - name: Create Google Play release name + id: release-name + run: | + RELEASE_NAME=$(echo "$(cat pubspec.yaml)" | sed -n -r "s/^version:\s{1}(.*)[+](.*)$/700\2 (\1)/p") + echo "release_name=$RELEASE_NAME" >> $GITHUB_ENV - name: Create Google Play release id: create-google-play-release-step @@ -210,9 +240,9 @@ jobs: serviceAccountJsonPlainText: ${{ secrets.GH_ACTIONS_SERVICE_ACCOUNT_JSON }} packageName: com.vodemn.lightmeter releaseFiles: app-prod-release.aab + releaseName: ${{ env.release_name }} track: production - status: draft - userFraction: 1.0 + status: completed debugSymbols: merged_native_libs.zip whatsNewDirectory: whatsnew From 5adcee00dd8b93af5c5f96315945259bd023dddc Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:25:37 +0200 Subject: [PATCH 24/49] ML-105 Hide providers from the widget tree (#106) * Added `ServiceProviders` widget * Added `EnumProviders` widget for enum values * Moved `ThemeProvider` functionality to `EnumProviders` * Style * `EnumProviders` -> `UserPreferencesProvider` * `ServiceProviders` -> `ServiceProvider` * Moved `MeteringScreenLayoutProvider` functionality to `UserPreferencesProvider` * typo * Removed `InheritedModelAspectListener` * TODO * Removed Inherited Generics * Removed redundant `LightmeterProviders` * Removed redundant methods from `ServicesProvider` * `_inheritFrom` -> `_inheritFromEnumsModel` * Fixed `MeteringScreenLayoutConfig` updates * Separated `_ThemeModel` * typo * `_EnumsModel` -> `_UserPreferencesModel` --- lib/application.dart | 124 +++++--- lib/providers.dart | 77 ----- lib/providers/equipment_profile_provider.dart | 69 +++- lib/providers/ev_source_type_provider.dart | 63 ---- .../metering_screen_layout_provider.dart | 60 ---- lib/providers/services_provider.dart | 36 +++ lib/providers/stop_type_provider.dart | 42 --- lib/providers/supported_locale_provider.dart | 53 ---- lib/providers/theme_provider.dart | 257 --------------- lib/providers/user_preferences_provider.dart | 295 ++++++++++++++++++ lib/res/theme.dart | 97 ++++++ .../widget_bottom_controls.dart | 4 +- .../camera_preview/widget_camera_preview.dart | 4 +- .../provider_container_camera.dart | 5 +- .../widget_container_camera.dart | 6 +- .../provider_container_light_sensor.dart | 5 +- .../widget_container_readings.dart | 19 +- lib/screens/metering/flow_metering.dart | 64 ++-- lib/screens/metering/screen_metering.dart | 25 +- .../listener_metering_layout_feature.dart | 52 +++ .../utils/listsner_equipment_profiles.dart | 30 ++ .../widget_list_tile_report_issue.dart | 5 +- .../widget_list_tile_source_code.dart | 5 +- .../widget_list_tile_write_email.dart | 5 +- .../caffeine/provider_list_tile_caffeine.dart | 5 +- .../haptics/provider_list_tile_haptics.dart | 5 +- .../language/widget_list_tile_language.dart | 9 +- .../provider_list_tile_volume_actions.dart | 5 +- .../provider_dialog_calibration.dart | 5 +- .../widget_dialog_calibration.dart | 5 +- .../widget_list_tile_calibration.dart | 7 +- .../screen_equipment_profile.dart | 19 +- .../widget_list_tile_fractional_stops.dart | 9 +- ...ialog_metering_screen_layout_features.dart | 6 +- .../widget_list_tile_dynamic_color.dart | 7 +- .../widget_dialog_picker_primary_color.dart | 6 +- .../widget_list_tile_primary_color.dart | 7 +- .../widget_list_tile_theme_type.dart | 9 +- .../theme/widget_settings_section_theme.dart | 4 +- lib/screens/settings/flow_settings.dart | 33 +- lib/screens/settings/screen_settings.dart | 7 +- lib/utils/inherited_generics.dart | 171 ---------- test/data/shared_prefs_service_test.dart | 6 +- 43 files changed, 790 insertions(+), 937 deletions(-) delete mode 100644 lib/providers.dart delete mode 100644 lib/providers/ev_source_type_provider.dart delete mode 100644 lib/providers/metering_screen_layout_provider.dart create mode 100644 lib/providers/services_provider.dart delete mode 100644 lib/providers/stop_type_provider.dart delete mode 100644 lib/providers/supported_locale_provider.dart delete mode 100644 lib/providers/theme_provider.dart create mode 100644 lib/providers/user_preferences_provider.dart create mode 100644 lib/res/theme.dart create mode 100644 lib/screens/metering/utils/listener_metering_layout_feature.dart create mode 100644 lib/screens/metering/utils/listsner_equipment_profiles.dart delete mode 100644 lib/utils/inherited_generics.dart diff --git a/lib/application.dart b/lib/application.dart index 3880a08..1249ed9 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -1,13 +1,22 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/light_sensor_service.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; +import 'package:lightmeter/data/permissions_service.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers.dart'; +import 'package:lightmeter/providers/equipment_profile_provider.dart'; +import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:platform/platform.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class Application extends StatelessWidget { final Environment env; @@ -16,56 +25,71 @@ class Application extends StatelessWidget { @override Widget build(BuildContext context) { - return LightmeterProviders( - env: env, - builder: (context, ready) => ready - ? _AnnotatedRegionWrapper( - child: MaterialApp( - theme: context.listen(), - locale: Locale(context.listen().intlName), - 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!, + return FutureBuilder( + future: Future.wait([ + SharedPreferences.getInstance(), + const LightSensorService(LocalPlatform()).hasSensor(), + ]), + builder: (_, snapshot) { + if (snapshot.data != null) { + return ServicesProvider( + caffeineService: const CaffeineService(), + environment: env.copyWith(hasLightSensor: snapshot.data![1] as bool), + hapticsService: const HapticsService(), + lightSensorService: const LightSensorService(LocalPlatform()), + permissionsService: const PermissionsService(), + userPreferencesService: UserPreferencesService(snapshot.data![0] as SharedPreferences), + volumeEventsService: const VolumeEventsService(LocalPlatform()), + child: UserPreferencesProvider( + child: EquipmentProfileProvider( + child: Builder( + builder: (context) { + final theme = UserPreferencesProvider.themeOf(context); + final systemIconsBrightness = + ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); + return AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: systemIconsBrightness == Brightness.light + ? Brightness.dark + : Brightness.light, + statusBarIconBrightness: systemIconsBrightness, + systemNavigationBarColor: Colors.transparent, + systemNavigationBarIconBrightness: systemIconsBrightness, + ), + child: MaterialApp( + theme: theme, + locale: Locale(UserPreferencesProvider.localeOf(context).intlName), + 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!, + ), + initialRoute: "metering", + routes: { + "metering": (context) => const MeteringFlow(), + "settings": (context) => const SettingsFlow(), + }, + ), + ); + }, ), - initialRoute: "metering", - routes: { - "metering": (context) => const MeteringFlow(), - "settings": (context) => const SettingsFlow(), - }, ), - ) - : const SizedBox(), - ); - } -} - -class _AnnotatedRegionWrapper extends StatelessWidget { - final Widget child; - - const _AnnotatedRegionWrapper({required this.child}); - - @override - Widget build(BuildContext context) { - final systemIconsBrightness = ThemeData.estimateBrightnessForColor( - context.listen().colorScheme.onSurface, - ); - return AnnotatedRegion( - value: SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: - systemIconsBrightness == Brightness.light ? Brightness.dark : Brightness.light, - statusBarIconBrightness: systemIconsBrightness, - systemNavigationBarColor: Colors.transparent, - systemNavigationBarIconBrightness: systemIconsBrightness, - ), - child: child, + ), + ); + } else if (snapshot.error != null) { + return Center(child: Text(snapshot.error!.toString())); + } + + // TODO(@vodemn): maybe user splashscreen instead + return const SizedBox(); + }, ); } } diff --git a/lib/providers.dart b/lib/providers.dart deleted file mode 100644 index d7907ab..0000000 --- a/lib/providers.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/caffeine_service.dart'; -import 'package:lightmeter/data/haptics_service.dart'; -import 'package:lightmeter/data/light_sensor_service.dart'; -import 'package:lightmeter/data/permissions_service.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/data/volume_events_service.dart'; -import 'package:lightmeter/environment.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; -import 'package:lightmeter/providers/ev_source_type_provider.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; -import 'package:lightmeter/providers/stop_type_provider.dart'; -import 'package:lightmeter/providers/supported_locale_provider.dart'; -import 'package:lightmeter/providers/theme_provider.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; -import 'package:platform/platform.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class LightmeterProviders extends StatelessWidget { - final Environment env; - final Widget Function(BuildContext context, bool ready) builder; - - const LightmeterProviders({required this.env, required this.builder, super.key}); - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: Future.wait([ - SharedPreferences.getInstance(), - const LightSensorService(LocalPlatform()).hasSensor(), - ]), - builder: (_, snapshot) { - if (snapshot.data != null) { - return InheritedWidgetBase( - data: env.copyWith(hasLightSensor: snapshot.data![1] as bool), - child: InheritedWidgetBase( - data: UserPreferencesService(snapshot.data![0] as SharedPreferences), - child: InheritedWidgetBase( - data: const LightSensorService(LocalPlatform()), - child: InheritedWidgetBase( - data: const CaffeineService(), - child: InheritedWidgetBase( - data: const HapticsService(), - child: InheritedWidgetBase( - data: const VolumeEventsService(LocalPlatform()), - child: InheritedWidgetBase( - data: const PermissionsService(), - child: MeteringScreenLayoutProvider( - child: StopTypeProvider( - child: EquipmentProfileProvider( - child: EvSourceTypeProvider( - child: SupportedLocaleProvider( - child: ThemeProvider( - child: Builder( - builder: (context) => builder(context, true), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ); - } else if (snapshot.error != null) { - return Center(child: Text(snapshot.error!.toString())); - } - return builder(context, false); - }, - ); - } -} diff --git a/lib/providers/equipment_profile_provider.dart b/lib/providers/equipment_profile_provider.dart index 85c9377..c0294fa 100644 --- a/lib/providers/equipment_profile_provider.dart +++ b/lib/providers/equipment_profile_provider.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:uuid/uuid.dart'; -typedef EquipmentProfiles = List; - +// TODO(@vodemn): This will be removed in #89 class EquipmentProfileProvider extends StatefulWidget { final Widget child; @@ -35,7 +33,8 @@ class EquipmentProfileProviderState extends State { EquipmentProfile get _selectedProfile => _customProfiles.firstWhere( (e) => e.id == _selectedId, orElse: () { - context.get().selectedEquipmentProfileId = _defaultProfile.id; + ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId = + _defaultProfile.id; return _defaultProfile; }, ); @@ -43,18 +42,16 @@ class EquipmentProfileProviderState extends State { @override void initState() { super.initState(); - _selectedId = context.get().selectedEquipmentProfileId; - _customProfiles = context.get().equipmentProfiles; + _selectedId = ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId; + _customProfiles = ServicesProvider.of(context).userPreferencesService.equipmentProfiles; } @override Widget build(BuildContext context) { - return InheritedWidgetBase>( - data: [_defaultProfile] + _customProfiles, - child: InheritedWidgetBase( - data: _selectedProfile, - child: widget.child, - ), + return EquipmentProfiles( + profiles: [_defaultProfile] + _customProfiles, + selected: _selectedProfile, + child: widget.child, ); } @@ -62,7 +59,8 @@ class EquipmentProfileProviderState extends State { setState(() { _selectedId = data.id; }); - context.get().selectedEquipmentProfileId = _selectedProfile.id; + ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId = + _selectedProfile.id; } /// Creates a default equipment profile @@ -94,7 +92,48 @@ class EquipmentProfileProviderState extends State { } void _refreshSavedProfiles() { - context.get().equipmentProfiles = _customProfiles; + ServicesProvider.of(context).userPreferencesService.equipmentProfiles = _customProfiles; setState(() {}); } } + +// Copied from #89 +enum EquipmentProfilesAspect { list, selected } + +class EquipmentProfiles extends InheritedModel { + const EquipmentProfiles({ + super.key, + required this.profiles, + required this.selected, + required super.child, + }); + + final List profiles; + final EquipmentProfile selected; + + static List of(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: EquipmentProfilesAspect.list, + )! + .profiles; + } + + static EquipmentProfile selectedOf(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: EquipmentProfilesAspect.selected, + )! + .selected; + } + + @override + bool updateShouldNotify(EquipmentProfiles oldWidget) => false; + + @override + bool updateShouldNotifyDependent( + EquipmentProfiles oldWidget, + Set dependencies, + ) => + false; +} diff --git a/lib/providers/ev_source_type_provider.dart b/lib/providers/ev_source_type_provider.dart deleted file mode 100644 index aed873b..0000000 --- a/lib/providers/ev_source_type_provider.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/models/ev_source_type.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/environment.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; - -class EvSourceTypeProvider extends StatefulWidget { - final Widget child; - - const EvSourceTypeProvider({required this.child, super.key}); - - static EvSourceTypeProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => EvSourceTypeProviderState(); -} - -class EvSourceTypeProviderState extends State { - late final ValueNotifier valueListenable; - - @override - void initState() { - super.initState(); - final evSourceType = context.get().evSourceType; - valueListenable = ValueNotifier( - evSourceType == EvSourceType.sensor && !context.get().hasLightSensor - ? EvSourceType.camera - : evSourceType, - ); - } - - @override - void dispose() { - valueListenable.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ValueListenableBuilder( - valueListenable: valueListenable, - builder: (_, value, child) => InheritedWidgetBase( - data: value, - child: child!, - ), - child: widget.child, - ); - } - - void toggleType() { - switch (valueListenable.value) { - case EvSourceType.camera: - if (context.get().hasLightSensor) { - valueListenable.value = EvSourceType.sensor; - } - case EvSourceType.sensor: - valueListenable.value = EvSourceType.camera; - } - context.get().evSourceType = valueListenable.value; - } -} diff --git a/lib/providers/metering_screen_layout_provider.dart b/lib/providers/metering_screen_layout_provider.dart deleted file mode 100644 index 405c1a7..0000000 --- a/lib/providers/metering_screen_layout_provider.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; - -class MeteringScreenLayoutProvider extends StatefulWidget { - final Widget child; - - const MeteringScreenLayoutProvider({required this.child, super.key}); - - static MeteringScreenLayoutProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => MeteringScreenLayoutProviderState(); -} - -class MeteringScreenLayoutProviderState extends State { - late final MeteringScreenLayoutConfig _config = - context.get().meteringScreenLayout; - - @override - Widget build(BuildContext context) { - return InheritedModelBase( - data: MeteringScreenLayoutConfig.from(_config), - child: widget.child, - ); - } - - void updateFeatures(MeteringScreenLayoutConfig config) { - setState(() { - config.forEach((key, value) { - _config.update( - key, - (_) => value, - ifAbsent: () => value, - ); - }); - }); - context.get().meteringScreenLayout = _config; - } -} - -typedef _MeteringScreenLayoutModel = InheritedModelBase; - -extension MeteringScreenLayout on InheritedModelBase { - static MeteringScreenLayoutConfig of(BuildContext context, {bool listen = true}) { - if (listen) { - return context.dependOnInheritedWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; - } else { - return context.findAncestorWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; - } - } - - static bool featureOf(BuildContext context, MeteringScreenLayoutFeature aspect) { - return InheritedModel.inheritFrom<_MeteringScreenLayoutModel>(context, aspect: aspect)! - .data[aspect]!; - } -} diff --git a/lib/providers/services_provider.dart b/lib/providers/services_provider.dart new file mode 100644 index 0000000..c2c548f --- /dev/null +++ b/lib/providers/services_provider.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/light_sensor_service.dart'; +import 'package:lightmeter/data/permissions_service.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; +import 'package:lightmeter/environment.dart'; + +class ServicesProvider extends InheritedWidget { + final CaffeineService caffeineService; + final Environment environment; + final HapticsService hapticsService; + final LightSensorService lightSensorService; + final PermissionsService permissionsService; + final UserPreferencesService userPreferencesService; + final VolumeEventsService volumeEventsService; + + const ServicesProvider({ + required this.caffeineService, + required this.environment, + required this.hapticsService, + required this.lightSensorService, + required this.permissionsService, + required this.userPreferencesService, + required this.volumeEventsService, + required super.child, + }); + + static ServicesProvider of(BuildContext context) { + return context.findAncestorWidgetOfExactType()!; + } + + @override + bool updateShouldNotify(ServicesProvider oldWidget) => false; +} diff --git a/lib/providers/stop_type_provider.dart b/lib/providers/stop_type_provider.dart deleted file mode 100644 index 3b20dd5..0000000 --- a/lib/providers/stop_type_provider.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; - -class StopTypeProvider extends StatefulWidget { - final Widget child; - - const StopTypeProvider({required this.child, super.key}); - - static StopTypeProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => StopTypeProviderState(); -} - -class StopTypeProviderState extends State { - late StopType _stopType; - - @override - void initState() { - super.initState(); - _stopType = context.get().stopType; - } - - @override - Widget build(BuildContext context) { - return InheritedWidgetBase( - data: _stopType, - child: widget.child, - ); - } - - void set(StopType type) { - setState(() { - _stopType = type; - }); - context.get().stopType = type; - } -} diff --git a/lib/providers/supported_locale_provider.dart b/lib/providers/supported_locale_provider.dart deleted file mode 100644 index caa7ced..0000000 --- a/lib/providers/supported_locale_provider.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/models/supported_locale.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; - -class SupportedLocaleProvider extends StatefulWidget { - final Widget child; - - const SupportedLocaleProvider({required this.child, super.key}); - - static SupportedLocaleProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => SupportedLocaleProviderState(); -} - -class SupportedLocaleProviderState extends State { - late final ValueNotifier valueListenable; - - @override - void initState() { - super.initState(); - valueListenable = ValueNotifier(context.get().locale); - } - - @override - void dispose() { - valueListenable.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ValueListenableBuilder( - valueListenable: valueListenable, - builder: (_, value, child) => InheritedWidgetBase( - data: value, - child: child!, - ), - child: widget.child, - ); - } - - void setLocale(SupportedLocale locale) { - S.load(Locale(locale.intlName)).then((value) { - valueListenable.value = locale; - context.get().locale = locale; - }); - } -} diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart deleted file mode 100644 index 9773df1..0000000 --- a/lib/providers/theme_provider.dart +++ /dev/null @@ -1,257 +0,0 @@ -import 'package:dynamic_color/dynamic_color.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:lightmeter/data/models/dynamic_colors_state.dart'; -import 'package:lightmeter/data/models/theme_type.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; -import 'package:material_color_utilities/material_color_utilities.dart'; - -class ThemeProvider extends StatefulWidget { - final Widget child; - - const ThemeProvider({ - required this.child, - super.key, - }); - - static ThemeProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - static const primaryColorsList = [ - Color(0xfff44336), - Color(0xffe91e63), - Color(0xff9c27b0), - Color(0xff673ab7), - Color(0xff3f51b5), - Color(0xff2196f3), - Color(0xff03a9f4), - Color(0xff00bcd4), - Color(0xff009688), - Color(0xff4caf50), - Color(0xff8bc34a), - Color(0xffcddc39), - Color(0xffffeb3b), - Color(0xffffc107), - Color(0xffff9800), - Color(0xffff5722), - ]; - - @override - State createState() => ThemeProviderState(); -} - -class ThemeProviderState extends State with WidgetsBindingObserver { - UserPreferencesService get _prefs => context.get(); - - late final _themeTypeNotifier = ValueNotifier(_prefs.themeType); - late final _dynamicColorNotifier = ValueNotifier(_prefs.dynamicColor); - late final _primaryColorNotifier = ValueNotifier(_prefs.primaryColor); - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - } - - @override - void didChangePlatformBrightness() { - super.didChangePlatformBrightness(); - setState(() {}); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _themeTypeNotifier.dispose(); - _dynamicColorNotifier.dispose(); - _primaryColorNotifier.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ValueListenableBuilder( - valueListenable: _themeTypeNotifier, - builder: (_, themeType, __) => InheritedWidgetBase( - data: themeType, - child: ValueListenableBuilder( - valueListenable: _dynamicColorNotifier, - builder: (_, useDynamicColor, __) => _DynamicColorProvider( - useDynamicColor: useDynamicColor, - themeBrightness: _themeBrightness, - builder: (_, dynamicPrimaryColor) => ValueListenableBuilder( - valueListenable: _primaryColorNotifier, - builder: (_, primaryColor, __) => _ThemeDataProvider( - primaryColor: dynamicPrimaryColor ?? primaryColor, - brightness: _themeBrightness, - child: widget.child, - ), - ), - ), - ), - ), - ); - } - - void setThemeType(ThemeType themeType) { - _themeTypeNotifier.value = themeType; - _prefs.themeType = themeType; - } - - Brightness get _themeBrightness { - switch (_themeTypeNotifier.value) { - case ThemeType.light: - return Brightness.light; - case ThemeType.dark: - return Brightness.dark; - case ThemeType.systemDefault: - return SchedulerBinding.instance.platformDispatcher.platformBrightness; - } - } - - void setPrimaryColor(Color color) { - _primaryColorNotifier.value = color; - _prefs.primaryColor = color; - } - - void enableDynamicColor(bool enable) { - _dynamicColorNotifier.value = enable; - _prefs.dynamicColor = enable; - } -} - -class _DynamicColorProvider extends StatelessWidget { - final bool useDynamicColor; - final Brightness themeBrightness; - final Widget Function(BuildContext context, Color? primaryColor) builder; - - const _DynamicColorProvider({ - required this.useDynamicColor, - required this.themeBrightness, - required this.builder, - }); - - @override - Widget build(BuildContext context) { - return DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) { - late final DynamicColorState state; - late final Color? dynamicPrimaryColor; - if (lightDynamic != null && darkDynamic != null) { - if (useDynamicColor) { - dynamicPrimaryColor = - (themeBrightness == Brightness.light ? lightDynamic : darkDynamic).primary; - state = DynamicColorState.enabled; - } else { - dynamicPrimaryColor = null; - state = DynamicColorState.disabled; - } - } else { - dynamicPrimaryColor = null; - state = DynamicColorState.unavailable; - } - return InheritedWidgetBase( - data: state, - child: builder(context, dynamicPrimaryColor), - ); - }, - ); - } -} - -class _ThemeDataProvider extends StatelessWidget { - final Color primaryColor; - final Brightness brightness; - final Widget child; - - const _ThemeDataProvider({ - required this.primaryColor, - required this.brightness, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return InheritedWidgetBase( - data: _themeFromColorScheme(_colorSchemeFromColor()), - child: child, - ); - } - - ThemeData _themeFromColorScheme(ColorScheme scheme) { - return ThemeData( - useMaterial3: true, - brightness: scheme.brightness, - primaryColor: primaryColor, - colorScheme: scheme, - appBarTheme: AppBarTheme( - elevation: 4, - color: scheme.surface, - surfaceTintColor: scheme.surfaceTint, - ), - cardTheme: CardTheme( - clipBehavior: Clip.antiAlias, - color: scheme.surface, - elevation: 4, - margin: EdgeInsets.zero, - shadowColor: Colors.transparent, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(Dimens.borderRadiusL)), - surfaceTintColor: scheme.surfaceTint, - ), - dialogBackgroundColor: scheme.surface, - dialogTheme: DialogTheme( - backgroundColor: scheme.surface, - surfaceTintColor: scheme.surfaceTint, - elevation: 6, - ), - dividerColor: scheme.outlineVariant, - dividerTheme: DividerThemeData( - color: scheme.outlineVariant, - space: 0, - ), - listTileTheme: ListTileThemeData( - style: ListTileStyle.list, - iconColor: scheme.onSurface, - textColor: scheme.onSurface, - ), - scaffoldBackgroundColor: scheme.surface, - ); - } - - ColorScheme _colorSchemeFromColor() { - final scheme = brightness == Brightness.light - ? Scheme.light(primaryColor.value) - : Scheme.dark(primaryColor.value); - - return ColorScheme( - brightness: brightness, - background: Color(scheme.background), - error: Color(scheme.error), - errorContainer: Color(scheme.errorContainer), - onBackground: Color(scheme.onBackground), - onError: Color(scheme.onError), - onErrorContainer: Color(scheme.onErrorContainer), - primary: Color(scheme.primary), - onPrimary: Color(scheme.onPrimary), - primaryContainer: Color(scheme.primaryContainer), - onPrimaryContainer: Color(scheme.onPrimaryContainer), - secondary: Color(scheme.secondary), - onSecondary: Color(scheme.onSecondary), - surface: Color.alphaBlend( - Color(scheme.primary).withOpacity(0.05), - Color(scheme.background), - ), - onSurface: Color(scheme.onSurface), - surfaceVariant: Color.alphaBlend( - Color(scheme.primary).withOpacity(0.5), - Color(scheme.background), - ), - onSurfaceVariant: Color(scheme.onSurfaceVariant), - outline: Color(scheme.outline), - outlineVariant: Color(scheme.outlineVariant), - ); - } -} diff --git a/lib/providers/user_preferences_provider.dart b/lib/providers/user_preferences_provider.dart new file mode 100644 index 0000000..af644d1 --- /dev/null +++ b/lib/providers/user_preferences_provider.dart @@ -0,0 +1,295 @@ +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:lightmeter/data/models/dynamic_colors_state.dart'; +import 'package:lightmeter/data/models/ev_source_type.dart'; +import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; +import 'package:lightmeter/data/models/supported_locale.dart'; +import 'package:lightmeter/data/models/theme_type.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/res/theme.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class UserPreferencesProvider extends StatefulWidget { + final Widget child; + + const UserPreferencesProvider({required this.child, super.key}); + + static _UserPreferencesProviderState of(BuildContext context) { + return context.findAncestorStateOfType<_UserPreferencesProviderState>()!; + } + + static DynamicColorState dynamicColorStateOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.dynamicColorState).dynamicColorState; + } + + static EvSourceType evSourceTypeOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.evSourceType).evSourceType; + } + + static SupportedLocale localeOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.locale).locale; + } + + static MeteringScreenLayoutConfig meteringScreenConfigOf(BuildContext context) { + return context.findAncestorWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; + } + + static bool meteringScreenFeatureOf(BuildContext context, MeteringScreenLayoutFeature feature) { + return InheritedModel.inheritFrom<_MeteringScreenLayoutModel>(context, aspect: feature)! + .data[feature]!; + } + + static StopType stopTypeOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.stopType).stopType; + } + + static ThemeData themeOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.theme).theme; + } + + static ThemeType themeTypeOf(BuildContext context) { + return _inheritFromEnumsModel(context, _Aspect.themeType).themeType; + } + + static _UserPreferencesModel _inheritFromEnumsModel( + BuildContext context, + _Aspect aspect, + ) { + return InheritedModel.inheritFrom<_UserPreferencesModel>(context, aspect: aspect)!; + } + + @override + State createState() => _UserPreferencesProviderState(); +} + +class _UserPreferencesProviderState extends State + with WidgetsBindingObserver { + UserPreferencesService get userPreferencesService => + ServicesProvider.of(context).userPreferencesService; + + late bool dynamicColor = userPreferencesService.dynamicColor; + late EvSourceType evSourceType; + late MeteringScreenLayoutConfig meteringScreenLayout = + userPreferencesService.meteringScreenLayout; + late Color primaryColor = userPreferencesService.primaryColor; + late StopType stopType = userPreferencesService.stopType; + late SupportedLocale locale = userPreferencesService.locale; + late ThemeType themeType = userPreferencesService.themeType; + + @override + void initState() { + super.initState(); + evSourceType = userPreferencesService.evSourceType; + evSourceType = evSourceType == EvSourceType.sensor && + !ServicesProvider.of(context).environment.hasLightSensor + ? EvSourceType.camera + : evSourceType; + WidgetsBinding.instance.addObserver(this); + } + + @override + void didChangePlatformBrightness() { + super.didChangePlatformBrightness(); + setState(() {}); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return DynamicColorBuilder( + builder: (lightDynamic, darkDynamic) { + late final DynamicColorState state; + late final Color? dynamicPrimaryColor; + if (lightDynamic != null && darkDynamic != null) { + if (dynamicColor) { + dynamicPrimaryColor = + (_themeBrightness == Brightness.light ? lightDynamic : darkDynamic).primary; + state = DynamicColorState.enabled; + } else { + dynamicPrimaryColor = null; + state = DynamicColorState.disabled; + } + } else { + dynamicPrimaryColor = null; + state = DynamicColorState.unavailable; + } + return _UserPreferencesModel( + brightness: _themeBrightness, + dynamicColorState: state, + evSourceType: evSourceType, + locale: locale, + primaryColor: dynamicPrimaryColor ?? primaryColor, + stopType: stopType, + themeType: themeType, + child: _MeteringScreenLayoutModel( + data: meteringScreenLayout, + child: widget.child, + ), + ); + }, + ); + } + + void enableDynamicColor(bool enable) { + setState(() { + dynamicColor = enable; + }); + userPreferencesService.dynamicColor = enable; + } + + void toggleEvSourceType() { + if (!ServicesProvider.of(context).environment.hasLightSensor) { + return; + } + setState(() { + switch (evSourceType) { + case EvSourceType.camera: + evSourceType = EvSourceType.sensor; + case EvSourceType.sensor: + evSourceType = EvSourceType.camera; + } + }); + userPreferencesService.evSourceType = evSourceType; + } + + void setLocale(SupportedLocale locale) { + S.load(Locale(locale.intlName)).then((value) { + setState(() { + this.locale = locale; + }); + userPreferencesService.locale = locale; + }); + } + + void setMeteringScreenLayout(MeteringScreenLayoutConfig config) { + setState(() { + meteringScreenLayout = config; + }); + userPreferencesService.meteringScreenLayout = meteringScreenLayout; + } + + void setPrimaryColor(Color primaryColor) { + setState(() { + this.primaryColor = primaryColor; + }); + userPreferencesService.primaryColor = primaryColor; + } + + void setStopType(StopType stopType) { + setState(() { + this.stopType = stopType; + }); + userPreferencesService.stopType = stopType; + } + + void setThemeType(ThemeType themeType) { + setState(() { + this.themeType = themeType; + }); + userPreferencesService.themeType = themeType; + } + + Brightness get _themeBrightness { + switch (themeType) { + case ThemeType.light: + return Brightness.light; + case ThemeType.dark: + return Brightness.dark; + case ThemeType.systemDefault: + return SchedulerBinding.instance.platformDispatcher.platformBrightness; + } + } +} + +enum _Aspect { + dynamicColorState, + evSourceType, + locale, + stopType, + theme, + themeType, +} + +class _UserPreferencesModel extends InheritedModel<_Aspect> { + final DynamicColorState dynamicColorState; + final EvSourceType evSourceType; + final SupportedLocale locale; + final StopType stopType; + final ThemeType themeType; + + final Brightness _brightness; + final Color _primaryColor; + + const _UserPreferencesModel({ + required Brightness brightness, + required this.dynamicColorState, + required this.evSourceType, + required this.locale, + required Color primaryColor, + required this.stopType, + required this.themeType, + required super.child, + }) : _brightness = brightness, + _primaryColor = primaryColor; + + ThemeData get theme => themeFrom(_primaryColor, _brightness); + + @override + bool updateShouldNotify(_UserPreferencesModel oldWidget) { + return _brightness != oldWidget._brightness || + dynamicColorState != oldWidget.dynamicColorState || + evSourceType != oldWidget.evSourceType || + locale != oldWidget.locale || + _primaryColor != oldWidget._primaryColor || + stopType != oldWidget.stopType || + themeType != oldWidget.themeType; + } + + @override + bool updateShouldNotifyDependent( + _UserPreferencesModel oldWidget, + Set<_Aspect> dependencies, + ) { + return (dependencies.contains(_Aspect.dynamicColorState) && + dynamicColorState != oldWidget.dynamicColorState) || + (dependencies.contains(_Aspect.evSourceType) && evSourceType != oldWidget.evSourceType) || + (dependencies.contains(_Aspect.locale) && locale != oldWidget.locale) || + (dependencies.contains(_Aspect.stopType) && stopType != oldWidget.stopType) || + (dependencies.contains(_Aspect.theme) && + (_brightness != oldWidget._brightness || _primaryColor != oldWidget._primaryColor)) || + (dependencies.contains(_Aspect.themeType) && themeType != oldWidget.themeType); + } +} + +class _MeteringScreenLayoutModel extends InheritedModel { + final Map data; + + const _MeteringScreenLayoutModel({ + required this.data, + required super.child, + }); + + @override + bool updateShouldNotify(_MeteringScreenLayoutModel oldWidget) => oldWidget.data != data; + + @override + bool updateShouldNotifyDependent( + _MeteringScreenLayoutModel oldWidget, + Set dependencies, + ) { + for (final dependecy in dependencies) { + if (oldWidget.data[dependecy] != data[dependecy]) { + return true; + } + } + return false; + } +} diff --git a/lib/res/theme.dart b/lib/res/theme.dart new file mode 100644 index 0000000..a6320c1 --- /dev/null +++ b/lib/res/theme.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/res/dimens.dart'; +import 'package:material_color_utilities/material_color_utilities.dart'; + +const primaryColorsList = [ + Color(0xfff44336), + Color(0xffe91e63), + Color(0xff9c27b0), + Color(0xff673ab7), + Color(0xff3f51b5), + Color(0xff2196f3), + Color(0xff03a9f4), + Color(0xff00bcd4), + Color(0xff009688), + Color(0xff4caf50), + Color(0xff8bc34a), + Color(0xffcddc39), + Color(0xffffeb3b), + Color(0xffffc107), + Color(0xffff9800), + Color(0xffff5722), +]; + +ThemeData themeFrom(Color primaryColor, Brightness brightness) { + final scheme = _colorSchemeFromColor(primaryColor, brightness); + return ThemeData( + useMaterial3: true, + brightness: scheme.brightness, + primaryColor: primaryColor, + colorScheme: scheme, + appBarTheme: AppBarTheme( + elevation: 4, + color: scheme.surface, + surfaceTintColor: scheme.surfaceTint, + ), + cardTheme: CardTheme( + clipBehavior: Clip.antiAlias, + color: scheme.surface, + elevation: 4, + margin: EdgeInsets.zero, + shadowColor: Colors.transparent, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(Dimens.borderRadiusL)), + surfaceTintColor: scheme.surfaceTint, + ), + dialogBackgroundColor: scheme.surface, + dialogTheme: DialogTheme( + backgroundColor: scheme.surface, + surfaceTintColor: scheme.surfaceTint, + elevation: 6, + ), + dividerColor: scheme.outlineVariant, + dividerTheme: DividerThemeData( + color: scheme.outlineVariant, + space: 0, + ), + listTileTheme: ListTileThemeData( + style: ListTileStyle.list, + iconColor: scheme.onSurface, + textColor: scheme.onSurface, + ), + scaffoldBackgroundColor: scheme.surface, + ); +} + +ColorScheme _colorSchemeFromColor(Color primaryColor, Brightness brightness) { + final scheme = brightness == Brightness.light + ? Scheme.light(primaryColor.value) + : Scheme.dark(primaryColor.value); + + return ColorScheme( + brightness: brightness, + background: Color(scheme.background), + error: Color(scheme.error), + errorContainer: Color(scheme.errorContainer), + onBackground: Color(scheme.onBackground), + onError: Color(scheme.onError), + onErrorContainer: Color(scheme.onErrorContainer), + primary: Color(scheme.primary), + onPrimary: Color(scheme.onPrimary), + primaryContainer: Color(scheme.primaryContainer), + onPrimaryContainer: Color(scheme.onPrimaryContainer), + secondary: Color(scheme.secondary), + onSecondary: Color(scheme.onSecondary), + surface: Color.alphaBlend( + Color(scheme.primary).withOpacity(0.05), + Color(scheme.background), + ), + onSurface: Color(scheme.onSurface), + surfaceVariant: Color.alphaBlend( + Color(scheme.primary).withOpacity(0.5), + Color(scheme.background), + ), + onSurfaceVariant: Color(scheme.onSurfaceVariant), + outline: Color(scheme.outline), + outlineVariant: Color(scheme.outlineVariant), + ); +} diff --git a/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart b/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart index 9989494..54ea810 100644 --- a/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart +++ b/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; +import 'package:lightmeter/providers/user_preferences_provider.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/utils/inherited_generics.dart'; class MeteringBottomControls extends StatelessWidget { final double? ev; @@ -42,7 +42,7 @@ class MeteringBottomControls extends StatelessWidget { child: IconButton( onPressed: onSwitchEvSourceType, icon: Icon( - context.listen() != EvSourceType.camera + UserPreferencesProvider.evSourceTypeOf(context) != EvSourceType.camera ? Icons.camera_rear : Icons.wb_incandescent, ), diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart index 288c678..ecfcb42 100644 --- a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart @@ -2,7 +2,7 @@ import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/platform_config.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view_placeholder/widget_placeholder_camera_view.dart'; @@ -38,7 +38,7 @@ class _CameraPreviewState extends State { alignment: Alignment.bottomCenter, children: [ CameraView(controller: widget.controller!), - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.histogram, )) diff --git a/lib/screens/metering/components/camera_container/provider_container_camera.dart b/lib/screens/metering/components/camera_container/provider_container_camera.dart index 344f573..0e27700 100644 --- a/lib/screens/metering/components/camera_container/provider_container_camera.dart +++ b/lib/screens/metering/components/camera_container/provider_container_camera.dart @@ -2,12 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; -import 'package:lightmeter/interactors/metering_interactor.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/event_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/widget_container_camera.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class CameraContainerProvider extends StatelessWidget { @@ -39,7 +38,7 @@ class CameraContainerProvider extends StatelessWidget { return BlocProvider( lazy: false, create: (context) => CameraContainerBloc( - context.get(), + MeteringInteractorProvider.of(context), context.read(), )..add(const RequestPermissionEvent()), child: CameraContainer( diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index e42991c..c510bc8 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -7,7 +7,7 @@ import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/features.dart'; import 'package:lightmeter/platform_config.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls/widget_camera_controls.dart'; @@ -114,14 +114,14 @@ class CameraContainer extends StatelessWidget { enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight; enabledFeaturesHeight += Dimens.paddingS; } - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) { enabledFeaturesHeight += Dimens.readingContainerDoubleValueHeight; enabledFeaturesHeight += Dimens.paddingS; } - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.filmPicker, )) { diff --git a/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart b/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart index c7423fc..aa27504 100644 --- a/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart +++ b/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart @@ -2,11 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; -import 'package:lightmeter/interactors/metering_interactor.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class LightSensorContainerProvider extends StatelessWidget { @@ -38,7 +37,7 @@ class LightSensorContainerProvider extends StatelessWidget { return BlocProvider( lazy: false, create: (context) => LightSensorContainerBloc( - context.get(), + MeteringInteractorProvider.of(context), context.read(), ), child: LightSensorContainer( diff --git a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart index 0893305..d31380c 100644 --- a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart +++ b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart @@ -5,11 +5,10 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/features.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class ReadingsContainer extends StatelessWidget { @@ -43,7 +42,7 @@ class ReadingsContainer extends StatelessWidget { const _EquipmentProfilePicker(), const _InnerPadding(), ], - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) ...[ @@ -61,7 +60,7 @@ class ReadingsContainer extends StatelessWidget { ), const _InnerPadding(), ], - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.filmPicker, )) ...[ @@ -77,7 +76,7 @@ class ReadingsContainer extends StatelessWidget { Expanded( child: _IsoValuePicker( selectedValue: iso, - values: context.listen().isoValues, + values: EquipmentProfiles.selectedOf(context).isoValues, onChanged: onIsoChanged, ), ), @@ -85,7 +84,7 @@ class ReadingsContainer extends StatelessWidget { Expanded( child: _NdValuePicker( selectedValue: nd, - values: context.listen().ndValues, + values: EquipmentProfiles.selectedOf(context).ndValues, onChanged: onNdChanged, ), ), @@ -108,16 +107,16 @@ class _EquipmentProfilePicker extends StatelessWidget { return AnimatedDialogPicker( icon: Icons.camera, title: S.of(context).equipmentProfile, - selectedValue: context.listen(), - values: context.listen(), + selectedValue: EquipmentProfiles.selectedOf(context), + values: EquipmentProfiles.of(context), itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name), onChanged: EquipmentProfileProvider.of(context).setProfile, closedChild: ReadingValueContainer.singleValue( value: ReadingValue( label: S.of(context).equipmentProfile, - value: context.listen().id.isEmpty + value: EquipmentProfiles.selectedOf(context).id.isEmpty ? S.of(context).none - : context.listen().name, + : EquipmentProfiles.selectedOf(context).name, ), ), ); diff --git a/lib/screens/metering/flow_metering.dart b/lib/screens/metering/flow_metering.dart index 1caef02..cca5675 100644 --- a/lib/screens/metering/flow_metering.dart +++ b/lib/screens/metering/flow_metering.dart @@ -1,17 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/data/caffeine_service.dart'; -import 'package:lightmeter/data/haptics_service.dart'; -import 'package:lightmeter/data/light_sensor_service.dart'; -import 'package:lightmeter/data/permissions_service.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/interactors/metering_interactor.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/components/shared/volume_keys_notifier/notifier_volume_keys.dart'; import 'package:lightmeter/screens/metering/screen_metering.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; class MeteringFlow extends StatefulWidget { const MeteringFlow({super.key}); @@ -23,31 +17,45 @@ class MeteringFlow extends StatefulWidget { class _MeteringFlowState extends State { @override Widget build(BuildContext context) { - return InheritedWidgetBase( + return MeteringInteractorProvider( data: MeteringInteractor( - context.get(), - context.get(), - context.get(), - context.get(), - context.get(), - context.get(), + ServicesProvider.of(context).userPreferencesService, + ServicesProvider.of(context).caffeineService, + ServicesProvider.of(context).hapticsService, + ServicesProvider.of(context).permissionsService, + ServicesProvider.of(context).lightSensorService, + ServicesProvider.of(context).volumeEventsService, )..initialize(), - child: InheritedWidgetBase( - data: VolumeKeysNotifier(context.get()), - child: MultiBlocProvider( - providers: [ - BlocProvider(create: (_) => MeteringCommunicationBloc()), - BlocProvider( - create: (context) => MeteringBloc( - context.get(), - context.get(), - context.read(), - ), + child: MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => MeteringCommunicationBloc()), + BlocProvider( + create: (context) => MeteringBloc( + MeteringInteractorProvider.of(context), + VolumeKeysNotifier(ServicesProvider.of(context).volumeEventsService), + context.read(), ), - ], - child: const MeteringScreen(), - ), + ), + ], + child: const MeteringScreen(), ), ); } } + +class MeteringInteractorProvider extends InheritedWidget { + final MeteringInteractor data; + + const MeteringInteractorProvider({ + required this.data, + required super.child, + super.key, + }); + + static MeteringInteractor of(BuildContext context) { + return context.findAncestorWidgetOfExactType()!.data; + } + + @override + bool updateShouldNotify(MeteringInteractorProvider oldWidget) => false; +} diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index bbfebfc..ba4dbea 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -6,15 +6,17 @@ import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/environment.dart'; -import 'package:lightmeter/providers/ev_source_type_provider.dart'; +import 'package:lightmeter/providers/equipment_profile_provider.dart'; +import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.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/camera_container/provider_container_camera.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart'; import 'package:lightmeter/screens/metering/event_metering.dart'; import 'package:lightmeter/screens/metering/state_metering.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/metering/utils/listener_metering_layout_feature.dart'; +import 'package:lightmeter/screens/metering/utils/listsner_equipment_profiles.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class MeteringScreen extends StatelessWidget { @@ -45,8 +47,8 @@ class MeteringScreen extends StatelessWidget { builder: (context, state) => MeteringBottomControlsProvider( ev: state is MeteringDataState ? state.ev : null, isMetering: state.isMetering, - onSwitchEvSourceType: context.get().hasLightSensor - ? EvSourceTypeProvider.of(context).toggleType + onSwitchEvSourceType: ServicesProvider.of(context).environment.hasLightSensor + ? UserPreferencesProvider.of(context).toggleEvSourceType : null, onMeasure: () => context.read().add(const MeasureEvent()), onSettings: () { @@ -71,12 +73,12 @@ class _InheritedListeners extends StatelessWidget { @override Widget build(BuildContext context) { - return InheritedWidgetListener( + return EquipmentProfileListener( onDidChangeDependencies: (value) { context.read().add(EquipmentProfileChangedEvent(value)); }, - child: InheritedModelAspectListener( - aspect: MeteringScreenLayoutFeature.filmPicker, + child: MeteringScreenLayoutFeatureListener( + feature: MeteringScreenLayoutFeature.filmPicker, onDidChangeDependencies: (value) { if (!value) context.read().add(const FilmChangedEvent(Film.other())); }, @@ -110,7 +112,8 @@ class _MeteringContainerBuidler extends StatelessWidget { final exposurePairs = ev != null ? buildExposureValues(context, ev!, film) : []; final fastest = exposurePairs.isNotEmpty ? exposurePairs.first : null; final slowest = exposurePairs.isNotEmpty ? exposurePairs.last : null; - return context.listen() == EvSourceType.camera + // Doubled build here when switching evSourceType. As new source bloc fires a new state on init + return UserPreferencesProvider.evSourceTypeOf(context) == EvSourceType.camera ? CameraContainerProvider( fastest: fastest, slowest: slowest, @@ -141,10 +144,10 @@ class _MeteringContainerBuidler extends StatelessWidget { } /// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3 - final StopType stopType = context.listen(); + final StopType stopType = UserPreferencesProvider.stopTypeOf(context); final int evSteps = (ev * (stopType.index + 1)).round(); - final EquipmentProfile equipmentProfile = context.listen(); + final EquipmentProfile equipmentProfile = EquipmentProfiles.selectedOf(context); final List apertureValues = equipmentProfile.apertureValues.whereStopType(stopType); final List shutterSpeedValues = diff --git a/lib/screens/metering/utils/listener_metering_layout_feature.dart b/lib/screens/metering/utils/listener_metering_layout_feature.dart new file mode 100644 index 0000000..c245ec3 --- /dev/null +++ b/lib/screens/metering/utils/listener_metering_layout_feature.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; + +/// Listening to multiple dependencies at the same time causes firing an event for all dependencies +/// even though some of them didn't change: +/// ```dart +/// @override +/// void didChangeDependencies() { +/// super.didChangeDependencies(); +/// _bloc.add(EquipmentProfileChangedEvent(EquipmentProfile.of(context))); +/// if (!MeteringScreenLayout.featureStatusOf(context, MeteringScreenLayoutFeature.filmPicker)) { +/// _bloc.add(const FilmChangedEvent(Film.other())); +/// } +/// } +/// ``` +/// To overcome this issue I've decided to create a generic listener, +/// that will listen to each dependency separately. +class MeteringScreenLayoutFeatureListener extends StatefulWidget { + final MeteringScreenLayoutFeature feature; + final ValueChanged onDidChangeDependencies; + final Widget child; + + const MeteringScreenLayoutFeatureListener({ + required this.feature, + required this.onDidChangeDependencies, + required this.child, + super.key, + }); + + @override + State createState() => + _MeteringScreenLayoutFeatureListenerState(); +} + +class _MeteringScreenLayoutFeatureListenerState extends State { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + widget.onDidChangeDependencies( + UserPreferencesProvider.meteringScreenFeatureOf( + context, + widget.feature, + ), + ); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } +} diff --git a/lib/screens/metering/utils/listsner_equipment_profiles.dart b/lib/screens/metering/utils/listsner_equipment_profiles.dart new file mode 100644 index 0000000..ec604ce --- /dev/null +++ b/lib/screens/metering/utils/listsner_equipment_profiles.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/providers/equipment_profile_provider.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class EquipmentProfileListener extends StatefulWidget { + final ValueChanged onDidChangeDependencies; + final Widget child; + + const EquipmentProfileListener({ + required this.onDidChangeDependencies, + required this.child, + super.key, + }); + + @override + State createState() => _EquipmentProfileListenerState(); +} + +class _EquipmentProfileListenerState extends State { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + widget.onDidChangeDependencies(EquipmentProfiles.selectedOf(context)); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } +} diff --git a/lib/screens/settings/components/about/components/report_issue/widget_list_tile_report_issue.dart b/lib/screens/settings/components/about/components/report_issue/widget_list_tile_report_issue.dart index 4c477f8..72bc1b5 100644 --- a/lib/screens/settings/components/about/components/report_issue/widget_list_tile_report_issue.dart +++ b/lib/screens/settings/components/about/components/report_issue/widget_list_tile_report_issue.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:url_launcher/url_launcher.dart'; class ReportIssueListTile extends StatelessWidget { @@ -14,7 +13,7 @@ class ReportIssueListTile extends StatelessWidget { title: Text(S.of(context).reportIssue), onTap: () { launchUrl( - Uri.parse(context.get().issuesReportUrl), + Uri.parse(ServicesProvider.of(context).environment.issuesReportUrl), mode: LaunchMode.externalApplication, ); }, diff --git a/lib/screens/settings/components/about/components/source_code/widget_list_tile_source_code.dart b/lib/screens/settings/components/about/components/source_code/widget_list_tile_source_code.dart index 42a73e8..4327332 100644 --- a/lib/screens/settings/components/about/components/source_code/widget_list_tile_source_code.dart +++ b/lib/screens/settings/components/about/components/source_code/widget_list_tile_source_code.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:url_launcher/url_launcher.dart'; class SourceCodeListTile extends StatelessWidget { @@ -14,7 +13,7 @@ class SourceCodeListTile extends StatelessWidget { title: Text(S.of(context).sourceCode), onTap: () { launchUrl( - Uri.parse(context.get().sourceCodeUrl), + Uri.parse(ServicesProvider.of(context).environment.sourceCodeUrl), mode: LaunchMode.externalApplication, ); }, diff --git a/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart b/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart index b12d0d4..b0a4391 100644 --- a/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart +++ b/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart @@ -1,8 +1,7 @@ import 'package:clipboard/clipboard.dart'; import 'package:flutter/material.dart'; -import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:url_launcher/url_launcher.dart'; class WriteEmailListTile extends StatelessWidget { @@ -14,7 +13,7 @@ class WriteEmailListTile extends StatelessWidget { leading: const Icon(Icons.email), title: Text(S.of(context).writeEmail), onTap: () { - final email = context.get().contactEmail; + final email = ServicesProvider.of(context).environment.contactEmail; final mailToUrl = Uri.parse('mailto:$email?subject=M3 Lightmeter'); canLaunchUrl(mailToUrl).then((canLaunch) { if (canLaunch) { diff --git a/lib/screens/settings/components/general/components/caffeine/provider_list_tile_caffeine.dart b/lib/screens/settings/components/general/components/caffeine/provider_list_tile_caffeine.dart index 4509d20..8d9bcfb 100644 --- a/lib/screens/settings/components/general/components/caffeine/provider_list_tile_caffeine.dart +++ b/lib/screens/settings/components/general/components/caffeine/provider_list_tile_caffeine.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/general/components/caffeine/bloc_list_tile_caffeine.dart'; import 'package:lightmeter/screens/settings/components/general/components/caffeine/widget_list_tile_caffeine.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; class CaffeineListTileProvider extends StatelessWidget { const CaffeineListTileProvider({super.key}); @@ -12,7 +11,7 @@ class CaffeineListTileProvider extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => CaffeineListTileBloc(context.get()), + create: (context) => CaffeineListTileBloc(SettingsInteractorProvider.of(context)), child: const CaffeineListTile(), ); } diff --git a/lib/screens/settings/components/general/components/haptics/provider_list_tile_haptics.dart b/lib/screens/settings/components/general/components/haptics/provider_list_tile_haptics.dart index beb0462..34cdeab 100644 --- a/lib/screens/settings/components/general/components/haptics/provider_list_tile_haptics.dart +++ b/lib/screens/settings/components/general/components/haptics/provider_list_tile_haptics.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/general/components/haptics/bloc_list_tile_haptics.dart'; import 'package:lightmeter/screens/settings/components/general/components/haptics/widget_list_tile_haptics.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; class HapticsListTileProvider extends StatelessWidget { const HapticsListTileProvider({super.key}); @@ -12,7 +11,7 @@ class HapticsListTileProvider extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => HapticsListTileBloc(context.get()), + create: (context) => HapticsListTileBloc(SettingsInteractorProvider.of(context)), child: const HapticsListTile(), ); } diff --git a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart index 381f286..663c634 100644 --- a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart +++ b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/supported_locale_provider.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/utils/inherited_generics.dart'; class LanguageListTile extends StatelessWidget { const LanguageListTile({super.key}); @@ -13,20 +12,20 @@ class LanguageListTile extends StatelessWidget { return ListTile( leading: const Icon(Icons.language), title: Text(S.of(context).language), - trailing: Text(context.listen().localizedName), + trailing: Text(UserPreferencesProvider.localeOf(context).localizedName), onTap: () { showDialog( context: context, builder: (_) => DialogPicker( icon: Icons.language, title: S.of(context).chooseLanguage, - selectedValue: context.get(), + selectedValue: UserPreferencesProvider.localeOf(context), values: SupportedLocale.values, titleAdapter: (context, value) => value.localizedName, ), ).then((value) { if (value != null) { - SupportedLocaleProvider.of(context).setLocale(value); + UserPreferencesProvider.of(context).setLocale(value); } }); }, diff --git a/lib/screens/settings/components/general/components/volume_actions/provider_list_tile_volume_actions.dart b/lib/screens/settings/components/general/components/volume_actions/provider_list_tile_volume_actions.dart index 790ad4f..f99505f 100644 --- a/lib/screens/settings/components/general/components/volume_actions/provider_list_tile_volume_actions.dart +++ b/lib/screens/settings/components/general/components/volume_actions/provider_list_tile_volume_actions.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/general/components/volume_actions/bloc_list_tile_volume_actions.dart'; import 'package:lightmeter/screens/settings/components/general/components/volume_actions/widget_list_tile_volume_actions.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; class VolumeActionsListTileProvider extends StatelessWidget { const VolumeActionsListTileProvider({super.key}); @@ -12,7 +11,7 @@ class VolumeActionsListTileProvider extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => VolumeActionsListTileBloc(context.get()), + create: (context) => VolumeActionsListTileBloc(SettingsInteractorProvider.of(context)), child: const VolumeActionsListTile(), ); } diff --git a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart index a95ec1b..a26a6cf 100644 --- a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart +++ b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/bloc_dialog_calibration.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; class CalibrationDialogProvider extends StatelessWidget { const CalibrationDialogProvider({super.key}); @@ -12,7 +11,7 @@ class CalibrationDialogProvider extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => CalibrationDialogBloc(context.get()), + create: (context) => CalibrationDialogBloc(SettingsInteractorProvider.of(context)), child: const CalibrationDialog(), ); } diff --git a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart index 4c91c87..69a4f00 100644 --- a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart +++ b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart @@ -1,13 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/bloc_dialog_calibration.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/event_dialog_calibration.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/state_dialog_calibration.dart'; import 'package:lightmeter/screens/shared/centered_slider/widget_slider_centered.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; import 'package:lightmeter/utils/to_string_signed.dart'; class CalibrationDialog extends StatelessWidget { @@ -15,7 +14,7 @@ class CalibrationDialog extends StatelessWidget { @override Widget build(BuildContext context) { - final bool hasLightSensor = context.get().hasLightSensor; + final bool hasLightSensor = ServicesProvider.of(context).environment.hasLightSensor; return AlertDialog( icon: const Icon(Icons.settings_brightness), titlePadding: Dimens.dialogIconTitlePadding, diff --git a/lib/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart b/lib/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart index e591e4b..61690c4 100644 --- a/lib/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart +++ b/lib/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; class CalibrationListTile extends StatelessWidget { const CalibrationListTile({super.key}); @@ -15,8 +14,8 @@ class CalibrationListTile extends StatelessWidget { onTap: () { showDialog( context: context, - builder: (_) => InheritedWidgetBase( - data: context.get(), + builder: (_) => SettingsInteractorProvider( + data: SettingsInteractorProvider.of(context), child: const CalibrationDialogProvider(), ), ); diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index 4872d79..3120b38 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; + import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfilesScreen extends StatefulWidget { @@ -19,13 +19,12 @@ class _EquipmentProfilesScreenState extends State { static const maxProfiles = 5 + 1; // replace with a constant from iap late List> profileContainersKeys = []; - int get profilesCount => context.listen().length; + int get profilesCount => EquipmentProfiles.of(context).length; @override - void initState() { - super.initState(); - profileContainersKeys = context - .get() + void didChangeDependencies() { + super.didChangeDependencies(); + profileContainersKeys = EquipmentProfiles.of(context) .map((e) => GlobalKey(debugLabel: e.id)) .toList(); } @@ -58,14 +57,14 @@ class _EquipmentProfilesScreenState extends State { ), child: EquipmentProfileContainer( key: profileContainersKeys[index], - data: context.listen()[index], + data: EquipmentProfiles.of(context)[index], onExpand: () => _keepExpandedAt(index), onUpdate: (profileData) => _updateProfileAt(profileData, index), onDelete: () => _removeProfileAt(index), ), ) : const SizedBox.shrink(), - childCount: profileContainersKeys.length, + childCount: profilesCount, ), ), ], @@ -79,7 +78,6 @@ class _EquipmentProfilesScreenState extends State { ).then((value) { if (value != null) { EquipmentProfileProvider.of(context).addProfile(value); - profileContainersKeys.add(GlobalKey()); } }); } @@ -89,8 +87,7 @@ class _EquipmentProfilesScreenState extends State { } void _removeProfileAt(int index) { - EquipmentProfileProvider.of(context).deleteProfile(context.listen()[index]); - profileContainersKeys.removeAt(index); + EquipmentProfileProvider.of(context).deleteProfile(EquipmentProfiles.of(context)[index]); } void _keepExpandedAt(int index) { diff --git a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart index 2a27a56..1bcf6bc 100644 --- a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart +++ b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/stop_type_provider.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/utils/inherited_generics.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class StopTypeListTile extends StatelessWidget { @@ -13,20 +12,20 @@ class StopTypeListTile extends StatelessWidget { return ListTile( leading: const Icon(Icons.straighten), title: Text(S.of(context).fractionalStops), - trailing: Text(_typeToString(context, context.listen())), + trailing: Text(_typeToString(context, UserPreferencesProvider.stopTypeOf(context))), onTap: () { showDialog( context: context, builder: (_) => DialogPicker( icon: Icons.straighten, title: S.of(context).showFractionalStops, - selectedValue: context.get(), + selectedValue: UserPreferencesProvider.stopTypeOf(context), values: StopType.values, titleAdapter: _typeToString, ), ).then((value) { if (value != null) { - StopTypeProvider.of(context).set(value); + UserPreferencesProvider.of(context).setStopType(value); } }); }, diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart index d43f011..c60abab 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; class MeteringScreenLayoutFeaturesDialog extends StatefulWidget { @@ -14,7 +14,7 @@ class MeteringScreenLayoutFeaturesDialog extends StatefulWidget { class _MeteringScreenLayoutFeaturesDialogState extends State { late final _features = - MeteringScreenLayoutConfig.from(MeteringScreenLayout.of(context, listen: false)); + MeteringScreenLayoutConfig.from(UserPreferencesProvider.meteringScreenConfigOf(context)); @override Widget build(BuildContext context) { @@ -56,7 +56,7 @@ class _MeteringScreenLayoutFeaturesDialogState extends State() == DynamicColorState.enabled, - onChanged: ThemeProvider.of(context).enableDynamicColor, + value: UserPreferencesProvider.dynamicColorStateOf(context) == DynamicColorState.enabled, + onChanged: UserPreferencesProvider.of(context).enableDynamicColor, contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), ); } diff --git a/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart b/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart index 434336a..380faa1 100644 --- a/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart +++ b/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/theme_provider.dart'; import 'package:lightmeter/res/dimens.dart'; +import 'package:lightmeter/res/theme.dart'; import 'package:lightmeter/screens/shared/filled_circle/widget_circle_filled.dart'; class PrimaryColorDialogPicker extends StatefulWidget { @@ -38,9 +38,9 @@ class _PrimaryColorDialogPickerState extends State { padding: EdgeInsets.zero, child: Row( children: List.generate( - ThemeProvider.primaryColorsList.length, + primaryColorsList.length, (index) { - final color = ThemeProvider.primaryColorsList[index]; + final color = primaryColorsList[index]; return Padding( padding: EdgeInsets.only(left: index == 0 ? 0 : Dimens.paddingS), child: _SelectableColorItem( diff --git a/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart b/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart index afc1a7b..44de22e 100644 --- a/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart +++ b/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart @@ -1,17 +1,16 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/theme_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.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/utils/inherited_generics.dart'; class PrimaryColorListTile extends StatelessWidget { const PrimaryColorListTile({super.key}); @override Widget build(BuildContext context) { - if (context.listen() == DynamicColorState.enabled) { + if (UserPreferencesProvider.dynamicColorStateOf(context) == DynamicColorState.enabled) { return Opacity( opacity: Dimens.disabledOpacity, child: IgnorePointer( @@ -31,7 +30,7 @@ class PrimaryColorListTile extends StatelessWidget { builder: (_) => const PrimaryColorDialogPicker(), ).then((value) { if (value != null) { - ThemeProvider.of(context).setPrimaryColor(value); + UserPreferencesProvider.of(context).setPrimaryColor(value); } }); }, diff --git a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart index 46e1b86..8a95161 100644 --- a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart +++ b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/theme_provider.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/utils/inherited_generics.dart'; class ThemeTypeListTile extends StatelessWidget { const ThemeTypeListTile({super.key}); @@ -13,20 +12,20 @@ class ThemeTypeListTile extends StatelessWidget { return ListTile( leading: const Icon(Icons.brightness_6), title: Text(S.of(context).theme), - trailing: Text(_typeToString(context, context.listen())), + trailing: Text(_typeToString(context, UserPreferencesProvider.themeTypeOf(context))), onTap: () { showDialog( context: context, builder: (_) => DialogPicker( icon: Icons.brightness_6, title: S.of(context).chooseTheme, - selectedValue: context.get(), + selectedValue: UserPreferencesProvider.themeTypeOf(context), values: ThemeType.values, titleAdapter: _typeToString, ), ).then((value) { if (value != null) { - ThemeProvider.of(context).setThemeType(value); + UserPreferencesProvider.of(context).setThemeType(value); } }); }, diff --git a/lib/screens/settings/components/theme/widget_settings_section_theme.dart b/lib/screens/settings/components/theme/widget_settings_section_theme.dart index d137469..ee03c54 100644 --- a/lib/screens/settings/components/theme/widget_settings_section_theme.dart +++ b/lib/screens/settings/components/theme/widget_settings_section_theme.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/generated/l10n.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/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/theme_type/widget_list_tile_theme_type.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; class ThemeSettingsSection extends StatelessWidget { const ThemeSettingsSection({super.key}); @@ -17,7 +17,7 @@ class ThemeSettingsSection extends StatelessWidget { children: [ const ThemeTypeListTile(), const PrimaryColorListTile(), - if (context.get() != DynamicColorState.unavailable) + if (UserPreferencesProvider.dynamicColorStateOf(context) != DynamicColorState.unavailable) const DynamicColorListTile(), ], ); diff --git a/lib/screens/settings/flow_settings.dart b/lib/screens/settings/flow_settings.dart index 3195c25..f3c8156 100644 --- a/lib/screens/settings/flow_settings.dart +++ b/lib/screens/settings/flow_settings.dart @@ -1,25 +1,38 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/data/caffeine_service.dart'; -import 'package:lightmeter/data/haptics_service.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/interactors/settings_interactor.dart'; +import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/screens/settings/screen_settings.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; class SettingsFlow extends StatelessWidget { const SettingsFlow({super.key}); @override Widget build(BuildContext context) { - return InheritedWidgetBase( + return SettingsInteractorProvider( data: SettingsInteractor( - context.get(), - context.get(), - context.get(), - context.get(), + ServicesProvider.of(context).userPreferencesService, + ServicesProvider.of(context).caffeineService, + ServicesProvider.of(context).hapticsService, + ServicesProvider.of(context).volumeEventsService, ), child: const SettingsScreen(), ); } } + +class SettingsInteractorProvider extends InheritedWidget { + final SettingsInteractor data; + + const SettingsInteractorProvider({ + required this.data, + required super.child, + super.key, + }); + + static SettingsInteractor of(BuildContext context) { + return context.findAncestorWidgetOfExactType()!.data; + } + + @override + bool updateShouldNotify(SettingsInteractorProvider oldWidget) => false; +} diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 3c745bd..9332d3f 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/interactors/settings_interactor.dart'; import 'package:lightmeter/screens/settings/components/about/widget_settings_section_about.dart'; import 'package:lightmeter/screens/settings/components/general/widget_settings_section_general.dart'; import 'package:lightmeter/screens/settings/components/metering/widget_settings_section_metering.dart'; import 'package:lightmeter/screens/settings/components/theme/widget_settings_section_theme.dart'; +import 'package:lightmeter/screens/settings/flow_settings.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @@ -19,12 +18,12 @@ class _SettingsScreenState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - context.get().disableVolumeHandling(); + SettingsInteractorProvider.of(context).disableVolumeHandling(); } @override void deactivate() { - context.get().restoreVolumeHandling(); + SettingsInteractorProvider.of(context).restoreVolumeHandling(); super.deactivate(); } diff --git a/lib/utils/inherited_generics.dart b/lib/utils/inherited_generics.dart deleted file mode 100644 index 5f71ec6..0000000 --- a/lib/utils/inherited_generics.dart +++ /dev/null @@ -1,171 +0,0 @@ -import 'package:flutter/widgets.dart'; - -/// Listening to multiple dependencies at the same time causes firing an event for all dependencies -/// even though some of them didn't change: -/// ```dart -/// @override -/// void didChangeDependencies() { -/// super.didChangeDependencies(); -/// _bloc.add(EquipmentProfileChangedEvent(EquipmentProfile.of(context))); -/// if (!MeteringScreenLayout.featureStatusOf(context, MeteringScreenLayoutFeature.filmPicker)) { -/// _bloc.add(const FilmChangedEvent(Film.other())); -/// } -/// } -/// ``` -/// To overcome this issue I've decided to create a generic listener, -/// that will listen to each dependency separately. -class InheritedWidgetListener extends StatefulWidget { - final ValueChanged onDidChangeDependencies; - final Widget child; - - const InheritedWidgetListener({ - required this.onDidChangeDependencies, - required this.child, - super.key, - }); - - @override - State> createState() => _InheritedWidgetListenerState(); -} - -class _InheritedWidgetListenerState extends State> { - @override - void didChangeDependencies() { - super.didChangeDependencies(); - widget.onDidChangeDependencies(context.listen()); - } - - @override - Widget build(BuildContext context) { - return widget.child; - } -} - -class InheritedWidgetBase extends InheritedWidget { - final T data; - - const InheritedWidgetBase({ - required this.data, - required super.child, - super.key, - }); - - static T of(BuildContext context, {bool listen = true}) { - if (listen) { - return context.dependOnInheritedWidgetOfExactType>()!.data; - } else { - return context.findAncestorWidgetOfExactType>()!.data; - } - } - - @override - bool updateShouldNotify(InheritedWidgetBase oldWidget) => true; -} - -extension InheritedWidgetBaseContext on BuildContext { - T get() { - return InheritedWidgetBase.of(this, listen: false); - } - - T listen() { - return InheritedWidgetBase.of(this); - } -} - -/// Listening to multiple dependencies at the same time causes firing an event for all dependencies -/// even though some of them didn't change: -/// ```dart -/// @override -/// void didChangeDependencies() { -/// super.didChangeDependencies(); -/// _bloc.add(EquipmentProfileChangedEvent(EquipmentProfile.of(context))); -/// if (!MeteringScreenLayout.featureStatusOf(context, MeteringScreenLayoutFeature.filmPicker)) { -/// _bloc.add(const FilmChangedEvent(Film.other())); -/// } -/// } -/// ``` -/// To overcome this issue I've decided to create a generic listener, -/// that will listen to each dependency separately. -class InheritedModelAspectListener extends StatefulWidget { - final A aspect; - final ValueChanged onDidChangeDependencies; - final Widget child; - - const InheritedModelAspectListener({ - required this.aspect, - required this.onDidChangeDependencies, - required this.child, - super.key, - }); - - @override - State> createState() => - _InheritedModelAspectListenerState(); -} - -class _InheritedModelAspectListenerState - extends State> { - @override - void didChangeDependencies() { - super.didChangeDependencies(); - widget.onDidChangeDependencies(context.listenModelFeature(widget.aspect)); - } - - @override - Widget build(BuildContext context) { - return widget.child; - } -} - -class InheritedModelBase extends InheritedModel { - final Map data; - - const InheritedModelBase({ - required this.data, - required super.child, - super.key, - }); - - static Map of(BuildContext context, {bool listen = true}) { - if (listen) { - return context.dependOnInheritedWidgetOfExactType>()!.data; - } else { - return context.findAncestorWidgetOfExactType>()!.data; - } - } - - static T featureOf(BuildContext context, A aspect) { - return InheritedModel.inheritFrom>(context, aspect: aspect)! - .data[aspect]!; - } - - @override - bool updateShouldNotify(InheritedModelBase oldWidget) => true; - - @override - bool updateShouldNotifyDependent( - InheritedModelBase oldWidget, - Set dependencies, - ) { - for (final dependecy in dependencies) { - if (oldWidget.data[dependecy] != data[dependecy]) { - return true; - } - } - return false; - } -} - -extension InheritedModelBaseContext on BuildContext { - Map getModel() { - return InheritedModelBase.of(this, listen: false); - } - - Map listenModel() { - return InheritedModelBase.of(this); - } - - T listenModelFeature(A aspect) { - return InheritedModelBase.featureOf(this, aspect); - } -} diff --git a/test/data/shared_prefs_service_test.dart b/test/data/shared_prefs_service_test.dart index 514629f..692cb81 100644 --- a/test/data/shared_prefs_service_test.dart +++ b/test/data/shared_prefs_service_test.dart @@ -6,7 +6,7 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/providers/theme_provider.dart'; +import 'package:lightmeter/res/theme.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:mocktail/mocktail.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -348,13 +348,13 @@ void main() { group('primaryColor', () { test('get default', () { when(() => sharedPreferences.getInt(UserPreferencesService.primaryColorKey)).thenReturn(null); - expect(service.primaryColor, ThemeProvider.primaryColorsList[5]); + expect(service.primaryColor, primaryColorsList[5]); }); test('get', () { when(() => sharedPreferences.getInt(UserPreferencesService.primaryColorKey)) .thenReturn(0xff9c27b0); - expect(service.primaryColor, ThemeProvider.primaryColorsList[2]); + expect(service.primaryColor, primaryColorsList[2]); }); test('set', () { From aee527dccaac9cf8b632c1a53247c38cfccf123e Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 20 Aug 2023 11:14:37 +0200 Subject: [PATCH 25/49] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9375169 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: [vodemn] From a9f8223e4a1f7548b45e1a24e74d9d41ed6542be Mon Sep 17 00:00:00 2001 From: Vadim Date: Mon, 28 Aug 2023 11:39:20 +0200 Subject: [PATCH 26/49] Added Firebase Analytics --- android/app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/build.gradle b/android/app/build.gradle index 53774dc..5ccd388 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -109,4 +109,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.android.billingclient:billing-ktx:6.0.0" + implementation "com.google.firebase:firebase-analytics:17.4.1" } From e1c320b8047c9dd01383aa36af3cba287ad0a902 Mon Sep 17 00:00:00 2001 From: Vadim Date: Mon, 28 Aug 2023 16:01:04 +0200 Subject: [PATCH 27/49] Replaced user config with github-actions[bot] --- .github/workflows/create_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 07f76c8..3d238b4 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -149,8 +149,8 @@ jobs: - name: Commit changes run: | - git config --global user.name "vodemn" - git config --global user.email "vadim.turko@gmail.com" + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" git add -A git commit -m "Version bump" From d364de44864a836f422544565e334ddc6fb55ce5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Aug 2023 15:55:12 +0000 Subject: [PATCH 28/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 7f4fcb5..f8ba217 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: A new Flutter project. publish_to: "none" -version: 0.13.1+37 +version: 0.13.2+38 environment: sdk: ">=3.0.0 <4.0.0" From 4bb080a144e9233bd40ac4a5eeac6d3126256ae4 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sat, 2 Sep 2023 10:32:08 +0200 Subject: [PATCH 29/49] Implemented IAP & Equipment profiles (#89) * added equipment profiles to layout config * calculate layout height based on `MeteringScreenLayoutFeature` * Update cd_dev.yml * Fixed equipment profile tile padding * import * `webfactory/ssh-agent` * Update pubspec.yaml * fixed `MeteringScreenLayoutConfigJson` tests * fixed `UserPreferencesService` tests * reset selected equipment profile when layout feature is disabled * `IAPProductType.equipment` -> `IAPProductType.paidFeatures` * updated packages versions * Update shared_prefs_service.dart * Fixed & tested exposure pairs list builder * typo * typo * added iap repo stub * Renamed `EquipmentProfileData` ->`EquipmentProfile` * Moved `EquipmentProfileProvider` to iap repo * Update README.md * Fixed `EquipmentProfileListener` * Improved `EquipmentProfilesListTile` statuses visualization * Update README.md * Update ci.yml * Post-merge fixes * typo * Added workflow checks * more sophisticated iap icons * Include IAP by default * added loader for `IAPProductStatus.pending` * typo * Added equipment profiles list placeholder * typo * separated `IconPlaceholder` * improved `buildExposureValues` testing * cleanup --- .github/workflows/build_apk.yml | 16 +- .github/workflows/create_release.yml | 17 +- .github/workflows/pr_check.yml | 20 +- .vscode/launch.json | 2 + README.md | 19 +- iap/.gitignore | 36 + iap/.metadata | 10 + iap/LICENSE | 1 + iap/analysis_options.yaml | 4 + iap/lib/m3_lightmeter_iap.dart | 30 + iap/lib/src/data/models/iap_product.dart | 5 + .../providers/equipment_profile_provider.dart | 79 ++ .../src/providers/iap_products_provider.dart | 47 + iap/pubspec.yaml | 25 + ios/Runner.xcodeproj/project.pbxproj | 16 +- lib/application.dart | 24 +- lib/data/models/exposure_pair.dart | 12 + lib/data/models/film.dart | 2 + .../models/metering_screen_layout_config.dart | 9 +- lib/data/shared_prefs_service.dart | 7 +- lib/features.dart | 3 - lib/l10n/intl_en.arb | 3 +- lib/l10n/intl_fr.arb | 3 +- lib/l10n/intl_ru.arb | 3 +- lib/l10n/intl_zh.arb | 1 + lib/providers/equipment_profile_provider.dart | 139 --- lib/res/dimens.dart | 3 +- .../bloc_container_camera.dart | 2 +- .../widget_container_camera.dart | 8 +- .../bloc_container_light_sensor.dart | 2 +- .../widget_list_exposure_pairs.dart | 8 +- .../widget_container_readings.dart | 8 +- lib/screens/metering/screen_metering.dart | 94 +- .../utils/equipment_profile_listener.dart | 30 + .../utils/listsner_equipment_profiles.dart | 2 +- .../widget_container_equipment_profile.dart | 3 +- .../screen_equipment_profile.dart | 88 +- .../widget_list_tile_equipment_profiles.dart | 30 +- ...ialog_metering_screen_layout_features.dart | 31 +- .../widget_settings_section_metering.dart | 3 +- lib/screens/settings/screen_settings.dart | 1 + .../widget_icon_placeholder.dart} | 18 +- .../shared/sliver_screen/screen_sliver.dart | 3 +- lib/utils/log_2.dart | 3 - pubspec.yaml | 24 +- .../metering_screen_layout_config_test.dart | 35 +- test/data/shared_prefs_service_test.dart | 7 +- .../metering/screen_metering_test.dart | 966 ++++++++++++++++++ 48 files changed, 1608 insertions(+), 294 deletions(-) create mode 100644 iap/.gitignore create mode 100644 iap/.metadata create mode 100644 iap/LICENSE create mode 100644 iap/analysis_options.yaml create mode 100644 iap/lib/m3_lightmeter_iap.dart create mode 100644 iap/lib/src/data/models/iap_product.dart create mode 100644 iap/lib/src/providers/equipment_profile_provider.dart create mode 100644 iap/lib/src/providers/iap_products_provider.dart create mode 100644 iap/pubspec.yaml delete mode 100644 lib/features.dart delete mode 100644 lib/providers/equipment_profile_provider.dart create mode 100644 lib/screens/metering/utils/equipment_profile_listener.dart rename lib/screens/{metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart => shared/icon_placeholder/widget_icon_placeholder.dart} (68%) delete mode 100644 lib/utils/log_2.dart create mode 100644 test/screens/metering/screen_metering_test.dart diff --git a/.github/workflows/build_apk.yml b/.github/workflows/build_apk.yml index 9157f90..e61b38b 100644 --- a/.github/workflows/build_apk.yml +++ b/.github/workflows/build_apk.yml @@ -16,14 +16,28 @@ on: - dev - prod default: 'dev' + include-iap: + type: boolean + description: Include IAP package + default: true jobs: build: name: Build .apk runs-on: macos-11 timeout-minutes: 15 - steps: + - name: Connect private iap package + uses: webfactory/ssh-agent@v0.8.0 + if: ${{ inputs.include-iap }} + with: + ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }} + + - name: Override iap package with stub + if: ${{ !inputs.include-iap }} + run: | + echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml + - uses: actions/checkout@v3 with: submodules: recursive diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 3d238b4..e0281e3 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -31,6 +31,10 @@ on: type: boolean description: Create Google Play release default: true + include-iap: + type: boolean + description: Include IAP package + default: true env: BUILD_ARGS: --release --flavor prod --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_prod.dart @@ -38,10 +42,21 @@ env: jobs: build: name: Build .apk & .aab - if: ${{ inputs.github-release }} || ${{ inputs.google-play-release }} + if: ${{ inputs.github-release || inputs.google-play-release }} runs-on: macos-11 timeout-minutes: 30 steps: + - name: Connect private iap package + uses: webfactory/ssh-agent@v0.8.0 + if: ${{ inputs.include-iap }} + with: + ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }} + + - name: Override iap package with stub + if: ${{ !inputs.include-iap }} + run: | + echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml + - uses: actions/checkout@v3 with: submodules: recursive diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 9022170..e6f0294 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -11,13 +11,27 @@ on: pull_request: branches: ["main"] +env: + # Stub iap package if this worlflow is running from the PR from a fork + STUB_IAP: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + jobs: analyze_and_test: name: Analyze & test runs-on: macos-11 timeout-minutes: 10 - steps: + - name: Connect private iap package + uses: webfactory/ssh-agent@v0.8.0 + if: !env.STUB_IAP + with: + ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }} + + - name: Override iap package with stub + if: env.STUB_IAP + run: | + echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml + - uses: actions/checkout@v3 with: submodules: recursive @@ -25,7 +39,7 @@ jobs: - uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: '3.10.0' + flutter-version: "3.10.0" - name: Prepare flutter project run: | @@ -37,4 +51,4 @@ jobs: run: flutter analyze lib --fatal-infos - name: Run tests - run: flutter test \ No newline at end of file + run: flutter test diff --git a/.vscode/launch.json b/.vscode/launch.json index 822d34d..6cbc2bc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -31,6 +31,7 @@ { "name": "prod (android)", "request": "launch", + //"flutterMode": "release", "type": "dart", "args": [ "--flavor", @@ -43,6 +44,7 @@ { "name": "prod (ios)", "request": "launch", + //"flutterMode": "release", "type": "dart", "args": [ "--flavor", diff --git a/README.md b/README.md index f629aa2..c4af94a 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,22 @@ Out of the box Firebase Crashlytics won't work. If you want to add Crashlytics t ### 3. Get packages -Fetch all the neccessary dependencies and generate translation files by running the following commands: +As part of the app's functionallity is in the private repo, you have to replace these lines in _pubspec.yaml_: + +```yaml +m3_lightmeter_iap: + git: + url: "https://github.com/vodemn/m3_lightmeter_iap" + ref: main +``` +with these: +```yaml +m3_lightmeter_iap: + path: iap +``` +and run `flutter pub get` from the _iap/_ folder. + +Then you can fetch all the neccessary dependencies and generate translation files by running the following commands: ```console flutter pub get flutter pub run intl_utils:generate @@ -69,4 +84,4 @@ Apple does not provide API for reading Lux stream form the ambient light sensor. ## Volume buttons action -This can be [implemented](https://stackoverflow.com/questions/70161271/ios-override-hardware-volume-buttons-same-as-zello) but the app will be rejected due to [2.5.9](https://developer.apple.com/app-store/review/guidelines/#software-requirements) \ No newline at end of file +This can be [implemented](https://stackoverflow.com/questions/70161271/ios-override-hardware-volume-buttons-same-as-zello) but the app will be rejected due to [2.5.9](https://developer.apple.com/app-store/review/guidelines/#software-requirements) diff --git a/iap/.gitignore b/iap/.gitignore new file mode 100644 index 0000000..205884d --- /dev/null +++ b/iap/.gitignore @@ -0,0 +1,36 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ + +.fvm/ +*.properties +ios/Flutter/ +.flutter-plugins +.flutter-plugins-dependencies \ No newline at end of file diff --git a/iap/.metadata b/iap/.metadata new file mode 100644 index 0000000..acbef51 --- /dev/null +++ b/iap/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 9944297138845a94256f1cf37beb88ff9a8e811a + channel: stable + +project_type: package diff --git a/iap/LICENSE b/iap/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/iap/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/iap/analysis_options.yaml b/iap/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/iap/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/iap/lib/m3_lightmeter_iap.dart b/iap/lib/m3_lightmeter_iap.dart new file mode 100644 index 0000000..8fe8aa5 --- /dev/null +++ b/iap/lib/m3_lightmeter_iap.dart @@ -0,0 +1,30 @@ +library m3_lightmeter_iap; + +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/providers/equipment_profile_provider.dart'; +import 'package:m3_lightmeter_iap/src/providers/iap_products_provider.dart'; + +export 'src/data/models/iap_product.dart'; + +export 'src/providers/equipment_profile_provider.dart' hide EquipmentProfilesAspect; +export 'src/providers/iap_products_provider.dart'; + +class IAPProviders extends StatelessWidget { + final Object sharedPreferences; + final Widget child; + + const IAPProviders({ + required this.sharedPreferences, + required this.child, + super.key, + }); + + @override + Widget build(BuildContext context) { + return IAPProductsProvider( + child: EquipmentProfileProvider( + child: child, + ), + ); + } +} diff --git a/iap/lib/src/data/models/iap_product.dart b/iap/lib/src/data/models/iap_product.dart new file mode 100644 index 0000000..706e3f1 --- /dev/null +++ b/iap/lib/src/data/models/iap_product.dart @@ -0,0 +1,5 @@ +enum IAPProductType { paidFeatures } + +class IAPProduct { + IAPProduct(); +} diff --git a/iap/lib/src/providers/equipment_profile_provider.dart b/iap/lib/src/providers/equipment_profile_provider.dart new file mode 100644 index 0000000..4f7aa0f --- /dev/null +++ b/iap/lib/src/providers/equipment_profile_provider.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class EquipmentProfileProvider extends StatefulWidget { + final Widget child; + + const EquipmentProfileProvider({required this.child, super.key}); + + static EquipmentProfileProviderState of(BuildContext context) { + return context.findAncestorStateOfType()!; + } + + @override + State createState() => EquipmentProfileProviderState(); +} + +class EquipmentProfileProviderState extends State { + static const EquipmentProfile _defaultProfile = EquipmentProfile( + id: '', + name: '', + apertureValues: ApertureValue.values, + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values, + isoValues: IsoValue.values, + ); + + @override + Widget build(BuildContext context) { + return EquipmentProfiles( + profiles: const [_defaultProfile], + selected: _defaultProfile, + child: widget.child, + ); + } + + void setProfile(EquipmentProfile data) {} + + void addProfile(String name) {} + + void updateProdile(EquipmentProfile data) {} + + void deleteProfile(EquipmentProfile data) {} +} + +enum EquipmentProfilesAspect { list, selected } + +class EquipmentProfiles extends InheritedModel { + const EquipmentProfiles({ + super.key, + required this.profiles, + required this.selected, + required super.child, + }); + + final List profiles; + final EquipmentProfile selected; + + static List of(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: EquipmentProfilesAspect.list, + )! + .profiles; + } + + static EquipmentProfile selectedOf(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: EquipmentProfilesAspect.selected, + )! + .selected; + } + + @override + bool updateShouldNotify(EquipmentProfiles oldWidget) => false; + + @override + bool updateShouldNotifyDependent(EquipmentProfiles oldWidget, Set dependencies) => false; +} diff --git a/iap/lib/src/providers/iap_products_provider.dart b/iap/lib/src/providers/iap_products_provider.dart new file mode 100644 index 0000000..4ea3c98 --- /dev/null +++ b/iap/lib/src/providers/iap_products_provider.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/data/models/iap_product.dart'; + +class IAPProductsProvider extends StatefulWidget { + final Widget child; + + const IAPProductsProvider({required this.child, super.key}); + + static IAPProductsProviderState of(BuildContext context) { + return context.findAncestorStateOfType()!; + } + + @override + State createState() => IAPProductsProviderState(); +} + +class IAPProductsProviderState extends State { + @override + Widget build(BuildContext context) { + return IAPProducts( + products: const [], + child: widget.child, + ); + } + + Future buy(IAPProductType type) async {} +} + +class IAPProducts extends InheritedModel { + final List products; + + const IAPProducts({ + required this.products, + required super.child, + super.key, + }); + + static IAPProduct? of(BuildContext context, IAPProductType type) => null; + + static bool isPurchased(BuildContext context, IAPProductType type) => false; + + @override + bool updateShouldNotify(IAPProducts oldWidget) => false; + + @override + bool updateShouldNotifyDependent(covariant IAPProducts oldWidget, Set dependencies) => false; +} diff --git a/iap/pubspec.yaml b/iap/pubspec.yaml new file mode 100644 index 0000000..6aed37e --- /dev/null +++ b/iap/pubspec.yaml @@ -0,0 +1,25 @@ +name: m3_lightmeter_iap +description: IAP stubs for the M3 Lightmeter app. +version: 0.2.0 +publish_to: 'none' + +environment: + sdk: '>=2.19.2 <3.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + m3_lightmeter_resources: + git: + url: "https://github.com/vodemn/m3_lightmeter_resources" + ref: main + shared_preferences: 2.2.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + +flutter: + uses-material-design: true diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a858962..73ce339 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -237,6 +237,7 @@ }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -268,6 +269,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -371,7 +373,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -500,7 +502,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -523,7 +525,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -600,7 +602,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -675,7 +677,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -747,7 +749,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 74JQ9DBXY6; + DEVELOPMENT_TEAM = 489Z6UQMGN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/lib/application.dart b/lib/application.dart index 1249ed9..38ef0bf 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -10,11 +10,11 @@ import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:platform/platform.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -32,16 +32,18 @@ class Application extends StatelessWidget { ]), builder: (_, snapshot) { if (snapshot.data != null) { - return ServicesProvider( - caffeineService: const CaffeineService(), - environment: env.copyWith(hasLightSensor: snapshot.data![1] as bool), - hapticsService: const HapticsService(), - lightSensorService: const LightSensorService(LocalPlatform()), - permissionsService: const PermissionsService(), - userPreferencesService: UserPreferencesService(snapshot.data![0] as SharedPreferences), - volumeEventsService: const VolumeEventsService(LocalPlatform()), - child: UserPreferencesProvider( - child: EquipmentProfileProvider( + return IAPProviders( + sharedPreferences: snapshot.data![0] as SharedPreferences, + child: ServicesProvider( + caffeineService: const CaffeineService(), + environment: env.copyWith(hasLightSensor: snapshot.data![1] as bool), + hapticsService: const HapticsService(), + lightSensorService: const LightSensorService(LocalPlatform()), + permissionsService: const PermissionsService(), + userPreferencesService: + UserPreferencesService(snapshot.data![0] as SharedPreferences), + volumeEventsService: const VolumeEventsService(LocalPlatform()), + child: UserPreferencesProvider( child: Builder( builder: (context) { final theme = UserPreferencesProvider.themeOf(context); diff --git a/lib/data/models/exposure_pair.dart b/lib/data/models/exposure_pair.dart index 9df3ada..d3aa823 100644 --- a/lib/data/models/exposure_pair.dart +++ b/lib/data/models/exposure_pair.dart @@ -8,4 +8,16 @@ class ExposurePair { @override String toString() => '$aperture - $shutterSpeed'; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other.runtimeType != runtimeType) return false; + return other is ExposurePair && + other.aperture == aperture && + other.shutterSpeed == shutterSpeed; + } + + @override + int get hashCode => Object.hash(aperture, shutterSpeed, runtimeType); } diff --git a/lib/data/models/film.dart b/lib/data/models/film.dart index 2da1c9b..ab651e8 100644 --- a/lib/data/models/film.dart +++ b/lib/data/models/film.dart @@ -13,6 +13,8 @@ double log10polynomian( ) => a * pow(log10(x), 2) + b * log10(x) + c; +typedef ReciprocityFailureBuilder = ShutterSpeedValue Function(ShutterSpeedValue shutterSpeed); + /// Only Ilford films have reciprocity formulas provided by the manufacturer: /// https://www.ilfordphoto.com/wp/wp-content/uploads/2017/06/Reciprocity-Failure-Compensation.pdf /// diff --git a/lib/data/models/metering_screen_layout_config.dart b/lib/data/models/metering_screen_layout_config.dart index 0aae055..7802195 100644 --- a/lib/data/models/metering_screen_layout_config.dart +++ b/lib/data/models/metering_screen_layout_config.dart @@ -1,9 +1,14 @@ -enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker, histogram } +enum MeteringScreenLayoutFeature { + extremeExposurePairs, + filmPicker, + histogram, + equipmentProfiles, +} typedef MeteringScreenLayoutConfig = Map; extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig { - static MeteringScreenLayoutConfig fromJson(Map data) => + static MeteringScreenLayoutConfig fromJson(Map data) => { for (final f in MeteringScreenLayoutFeature.values) f: data[f.index.toString()] as bool? ?? true diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart index 8ae5487..812f0e6 100644 --- a/lib/data/shared_prefs_service.dart +++ b/lib/data/shared_prefs_service.dart @@ -95,6 +95,7 @@ class UserPreferencesService { ); } else { return { + MeteringScreenLayoutFeature.equipmentProfiles: true, MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, MeteringScreenLayoutFeature.histogram: true, @@ -147,10 +148,4 @@ class UserPreferencesService { orElse: () => Film.values.first, ); set film(Film value) => _sharedPreferences.setString(filmKey, value.name); - - String get selectedEquipmentProfileId => ''; // coverage:ignore-line - set selectedEquipmentProfileId(String id) {} // coverage:ignore-line - - List get equipmentProfiles => []; // coverage:ignore-line - set equipmentProfiles(List profiles) {} // coverage:ignore-line } diff --git a/lib/features.dart b/lib/features.dart deleted file mode 100644 index deede30..0000000 --- a/lib/features.dart +++ /dev/null @@ -1,3 +0,0 @@ -class FeaturesConfig { - static const bool equipmentProfilesEnabled = false; -} diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 1bfe8ed..925d280 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -54,6 +54,7 @@ "isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.", "equipmentProfile": "Equipment profile", "equipmentProfiles": "Equipment profiles", + "tapToAdd": "Tap to add", "general": "General", "keepScreenOn": "Keep screen on", "haptics": "Haptics", @@ -86,4 +87,4 @@ } } } -} \ No newline at end of file +} diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index f75d76b..c199d1e 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -42,6 +42,7 @@ "film": "Pellicule", "equipment": "Équipement", "equipmentProfileName": "Nom du profil de l'équipement", + "tapToAdd": "Appuie pour ajouter", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "Tout", "apertureValues": "Valeurs Aperture", @@ -86,4 +87,4 @@ } } } -} \ No newline at end of file +} diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 3a67fc2..d20c4bd 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -54,6 +54,7 @@ "isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.", "equipmentProfile": "Оборудование", "equipmentProfiles": "Профили оборудования", + "tapToAdd": "Нажмите, чтобы добавить", "general": "Общие", "keepScreenOn": "Запрет блокировки", "haptics": "Вибрация", @@ -86,4 +87,4 @@ } } } -} \ No newline at end of file +} diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 5d020cf..02bdf6c 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -54,6 +54,7 @@ "isoValuesFilterDescription": "选择要显示的 ISO。这些值可能是您最常用的值,也可能是相机支持的值。", "equipmentProfile": "设备配置", "equipmentProfiles": "设备配置", + "tapToAdd": "點擊添加", "general": "通用", "keepScreenOn": "保持屏幕常亮", "haptics": "震动", diff --git a/lib/providers/equipment_profile_provider.dart b/lib/providers/equipment_profile_provider.dart deleted file mode 100644 index c0294fa..0000000 --- a/lib/providers/equipment_profile_provider.dart +++ /dev/null @@ -1,139 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/providers/services_provider.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; -import 'package:uuid/uuid.dart'; - -// TODO(@vodemn): This will be removed in #89 -class EquipmentProfileProvider extends StatefulWidget { - final Widget child; - - const EquipmentProfileProvider({required this.child, super.key}); - - static EquipmentProfileProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => EquipmentProfileProviderState(); -} - -class EquipmentProfileProviderState extends State { - static const EquipmentProfile _defaultProfile = EquipmentProfile( - id: '', - name: '', - apertureValues: ApertureValue.values, - ndValues: NdValue.values, - shutterSpeedValues: ShutterSpeedValue.values, - isoValues: IsoValue.values, - ); - - List _customProfiles = []; - String _selectedId = ''; - - EquipmentProfile get _selectedProfile => _customProfiles.firstWhere( - (e) => e.id == _selectedId, - orElse: () { - ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId = - _defaultProfile.id; - return _defaultProfile; - }, - ); - - @override - void initState() { - super.initState(); - _selectedId = ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId; - _customProfiles = ServicesProvider.of(context).userPreferencesService.equipmentProfiles; - } - - @override - Widget build(BuildContext context) { - return EquipmentProfiles( - profiles: [_defaultProfile] + _customProfiles, - selected: _selectedProfile, - child: widget.child, - ); - } - - void setProfile(EquipmentProfile data) { - setState(() { - _selectedId = data.id; - }); - ServicesProvider.of(context).userPreferencesService.selectedEquipmentProfileId = - _selectedProfile.id; - } - - /// Creates a default equipment profile - void addProfile(String name) { - _customProfiles.add( - EquipmentProfile( - id: const Uuid().v1(), - name: name, - apertureValues: ApertureValue.values, - ndValues: NdValue.values, - shutterSpeedValues: ShutterSpeedValue.values, - isoValues: IsoValue.values, - ), - ); - _refreshSavedProfiles(); - } - - void updateProdile(EquipmentProfile data) { - final indexToUpdate = _customProfiles.indexWhere((element) => element.id == data.id); - if (indexToUpdate >= 0) { - _customProfiles[indexToUpdate] = data; - _refreshSavedProfiles(); - } - } - - void deleteProfile(EquipmentProfile data) { - _customProfiles.remove(data); - _refreshSavedProfiles(); - } - - void _refreshSavedProfiles() { - ServicesProvider.of(context).userPreferencesService.equipmentProfiles = _customProfiles; - setState(() {}); - } -} - -// Copied from #89 -enum EquipmentProfilesAspect { list, selected } - -class EquipmentProfiles extends InheritedModel { - const EquipmentProfiles({ - super.key, - required this.profiles, - required this.selected, - required super.child, - }); - - final List profiles; - final EquipmentProfile selected; - - static List of(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.list, - )! - .profiles; - } - - static EquipmentProfile selectedOf(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.selected, - )! - .selected; - } - - @override - bool updateShouldNotify(EquipmentProfiles oldWidget) => false; - - @override - bool updateShouldNotifyDependent( - EquipmentProfiles oldWidget, - Set dependencies, - ) => - false; -} diff --git a/lib/res/dimens.dart b/lib/res/dimens.dart index a1bb780..e3eed95 100644 --- a/lib/res/dimens.dart +++ b/lib/res/dimens.dart @@ -14,7 +14,6 @@ class Dimens { static const double grid48 = 48; static const double grid56 = 56; static const double grid72 = 72; - static const double grid168 = 168; static const double paddingS = 8; static const double paddingM = 16; @@ -30,6 +29,8 @@ class Dimens { static const double enabledOpacity = 1.0; static const double disabledOpacity = 0.38; + static const double sliverAppBarExpandedHeight = 168; + // TopBar static const double readingContainerDoubleValueHeight = 128; static const double readingContainerSingleValueHeight = 76; diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index 991bdf6..0313391 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -18,7 +18,7 @@ import 'package:lightmeter/screens/metering/components/camera_container/event_co import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart'; import 'package:lightmeter/screens/metering/components/camera_container/state_container_camera.dart'; import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart'; -import 'package:lightmeter/utils/log_2.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class CameraContainerBloc extends EvSourceBlocBase { final MeteringInteractor _meteringInteractor; diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index c510bc8..0514d92 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -5,7 +5,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/features.dart'; import 'package:lightmeter/platform_config.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; @@ -110,7 +109,10 @@ class CameraContainer extends StatelessWidget { double _meteringContainerHeight(BuildContext context) { double enabledFeaturesHeight = 0; - if (FeaturesConfig.equipmentProfilesEnabled) { + if (UserPreferencesProvider.meteringScreenFeatureOf( + context, + MeteringScreenLayoutFeature.equipmentProfiles, + )) { enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight; enabledFeaturesHeight += Dimens.paddingS; } @@ -133,7 +135,7 @@ class CameraContainer extends StatelessWidget { } double _cameraPreviewHeight(BuildContext context) { - return ((MediaQuery.of(context).size.width - Dimens.grid8 - 2 * Dimens.paddingM) / 2) / + return ((MediaQuery.sizeOf(context).width - Dimens.grid8 - 2 * Dimens.paddingM) / 2) / PlatformConfig.cameraPreviewAspectRatio; } } diff --git a/lib/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart b/lib/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart index 23cd796..c76727b 100644 --- a/lib/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart +++ b/lib/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart @@ -10,7 +10,7 @@ import 'package:lightmeter/screens/metering/communication/state_communication_me import 'package:lightmeter/screens/metering/components/light_sensor_container/event_container_light_sensor.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/state_container_light_sensor.dart'; import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart'; -import 'package:lightmeter/utils/log_2.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class LightSensorContainerBloc extends EvSourceBlocBase { diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart index 71b293e..3f33d03 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart'; import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart'; +import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; class ExposurePairsList extends StatelessWidget { final List exposurePairs; @@ -15,7 +16,10 @@ class ExposurePairsList extends StatelessWidget { return AnimatedSwitcher( duration: Dimens.switchDuration, child: exposurePairs.isEmpty - ? const EmptyExposurePairsList() + ? IconPlaceholder( + icon: Icons.not_interested, + text: S.of(context).noExposurePairs, + ) : Stack( alignment: Alignment.center, children: [ diff --git a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart index d31380c..c9f6f54 100644 --- a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart +++ b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart @@ -2,13 +2,12 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/features.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class ReadingsContainer extends StatelessWidget { @@ -38,7 +37,10 @@ class ReadingsContainer extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - if (FeaturesConfig.equipmentProfilesEnabled) ...[ + if (UserPreferencesProvider.meteringScreenFeatureOf( + context, + MeteringScreenLayoutFeature.equipmentProfiles, + )) ...[ const _EquipmentProfilePicker(), const _InnerPadding(), ], diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index ba4dbea..e9a77b5 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -6,7 +6,6 @@ import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; @@ -17,6 +16,7 @@ import 'package:lightmeter/screens/metering/event_metering.dart'; import 'package:lightmeter/screens/metering/state_metering.dart'; import 'package:lightmeter/screens/metering/utils/listener_metering_layout_feature.dart'; import 'package:lightmeter/screens/metering/utils/listsner_equipment_profiles.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class MeteringScreen extends StatelessWidget { @@ -31,7 +31,7 @@ class MeteringScreen extends StatelessWidget { children: [ Expanded( child: BlocBuilder( - builder: (_, state) => _MeteringContainerBuidler( + builder: (_, state) => MeteringContainerBuidler( ev: state is MeteringDataState ? state.ev : null, film: state.film, iso: state.iso, @@ -80,15 +80,25 @@ class _InheritedListeners extends StatelessWidget { child: MeteringScreenLayoutFeatureListener( feature: MeteringScreenLayoutFeature.filmPicker, onDidChangeDependencies: (value) { - if (!value) context.read().add(const FilmChangedEvent(Film.other())); + if (!value) { + context.read().add(const FilmChangedEvent(Film.other())); + } }, - child: child, + child: MeteringScreenLayoutFeatureListener( + feature: MeteringScreenLayoutFeature.equipmentProfiles, + onDidChangeDependencies: (value) { + if (!value) { + EquipmentProfileProvider.of(context).setProfile(EquipmentProfiles.of(context).first); + } + }, + child: child, + ), ), ); } } -class _MeteringContainerBuidler extends StatelessWidget { +class MeteringContainerBuidler extends StatelessWidget { final double? ev; final Film film; final IsoValue iso; @@ -97,7 +107,7 @@ class _MeteringContainerBuidler extends StatelessWidget { final ValueChanged onIsoChanged; final ValueChanged onNdChanged; - const _MeteringContainerBuidler({ + const MeteringContainerBuidler({ required this.ev, required this.film, required this.iso, @@ -109,7 +119,14 @@ class _MeteringContainerBuidler extends StatelessWidget { @override Widget build(BuildContext context) { - final exposurePairs = ev != null ? buildExposureValues(context, ev!, film) : []; + final exposurePairs = ev != null + ? buildExposureValues( + ev!, + UserPreferencesProvider.stopTypeOf(context), + EquipmentProfiles.selectedOf(context), + film, + ) + : []; final fastest = exposurePairs.isNotEmpty ? exposurePairs.first : null; final slowest = exposurePairs.isNotEmpty ? exposurePairs.last : null; // Doubled build here when switching evSourceType. As new source bloc fires a new state on init @@ -138,39 +155,28 @@ class _MeteringContainerBuidler extends StatelessWidget { ); } - List buildExposureValues(BuildContext context, double ev, Film film) { + @visibleForTesting + static List buildExposureValues( + double ev, + StopType stopType, + EquipmentProfile equipmentProfile, + Film film, + ) { if (ev.isNaN || ev.isInfinite) { return List.empty(); } /// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3 - final StopType stopType = UserPreferencesProvider.stopTypeOf(context); final int evSteps = (ev * (stopType.index + 1)).round(); - final EquipmentProfile equipmentProfile = EquipmentProfiles.selectedOf(context); - final List apertureValues = - equipmentProfile.apertureValues.whereStopType(stopType); - final List shutterSpeedValues = - equipmentProfile.shutterSpeedValues.whereStopType(stopType); + final apertureValues = ApertureValue.values.whereStopType(stopType); + final shutterSpeedValues = ShutterSpeedValue.values.whereStopType(stopType); /// Basically we use 1" shutter speed as an anchor point for building the exposure pairs list. /// But user can exclude this value from the list using custom equipment profile. /// So we have to restore the index of the anchor value. - const ShutterSpeedValue anchorShutterSpeed = ShutterSpeedValue(1, false, StopType.full); - int anchorIndex = shutterSpeedValues.indexOf(anchorShutterSpeed); - if (anchorIndex < 0) { - final filteredFullList = ShutterSpeedValue.values.whereStopType(stopType); - final customListStartIndex = filteredFullList.indexOf(shutterSpeedValues.first); - final fullListAnchor = filteredFullList.indexOf(anchorShutterSpeed); - if (customListStartIndex < fullListAnchor) { - /// This means, that user excluded anchor value at the end, - /// i.e. all shutter speed values are shorter than 1". - anchorIndex = fullListAnchor - customListStartIndex; - } else { - /// In case user excludes anchor value at the start, - /// we can do no adjustment. - } - } + const anchorShutterSpeed = ShutterSpeedValue(1, false, StopType.full); + final int anchorIndex = shutterSpeedValues.indexOf(anchorShutterSpeed); final int evOffset = anchorIndex - evSteps; late final int apertureOffset; @@ -189,10 +195,11 @@ class _MeteringContainerBuidler extends StatelessWidget { ) - max(apertureOffset, shutterSpeedOffset); - if (itemsCount < 0) { + if (itemsCount <= 0) { return List.empty(); } - return List.generate( + + final exposurePairs = List.generate( itemsCount, (index) => ExposurePair( apertureValues[index + apertureOffset], @@ -200,5 +207,30 @@ class _MeteringContainerBuidler extends StatelessWidget { ), growable: false, ); + + /// Full equipment profile, nothing to cut + if (equipmentProfile.id == "") { + return exposurePairs; + } + + final equipmentApertureValues = equipmentProfile.apertureValues.whereStopType(stopType); + final equipmentShutterSpeedValues = equipmentProfile.shutterSpeedValues.whereStopType(stopType); + + final startCutEV = max( + exposurePairs.first.aperture.difference(equipmentApertureValues.first), + exposurePairs.first.shutterSpeed.difference(equipmentShutterSpeedValues.first), + ); + final endCutEV = max( + equipmentApertureValues.last.difference(exposurePairs.last.aperture), + equipmentShutterSpeedValues.last.difference(exposurePairs.last.shutterSpeed), + ); + + final startCut = (startCutEV * (stopType.index + 1)).round().clamp(0, itemsCount); + final endCut = (endCutEV * (stopType.index + 1)).round().clamp(0, itemsCount); + + if (startCut > itemsCount - endCut) { + return const []; + } + return exposurePairs.sublist(startCut, itemsCount - endCut); } } diff --git a/lib/screens/metering/utils/equipment_profile_listener.dart b/lib/screens/metering/utils/equipment_profile_listener.dart new file mode 100644 index 0000000..68d03dc --- /dev/null +++ b/lib/screens/metering/utils/equipment_profile_listener.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class EquipmentProfileListener extends StatefulWidget { + final ValueChanged onDidChangeDependencies; + final Widget child; + + const EquipmentProfileListener({ + required this.onDidChangeDependencies, + required this.child, + super.key, + }); + + @override + State createState() => _EquipmentProfileListenerState(); +} + +class _EquipmentProfileListenerState extends State { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + widget.onDidChangeDependencies(EquipmentProfiles.selectedOf(context)); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } +} diff --git a/lib/screens/metering/utils/listsner_equipment_profiles.dart b/lib/screens/metering/utils/listsner_equipment_profiles.dart index ec604ce..68d03dc 100644 --- a/lib/screens/metering/utils/listsner_equipment_profiles.dart +++ b/lib/screens/metering/utils/listsner_equipment_profiles.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileListener extends StatefulWidget { diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index 1d9b7bf..e4a9e95 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -71,6 +71,7 @@ class EquipmentProfileContainerState extends State mainAxisSize: MainAxisSize.min, children: [ ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), title: Row( children: [ _AnimatedNameLeading(controller: _controller), @@ -163,7 +164,7 @@ class _AnimatedNameLeading extends AnimatedWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(right: _progress.value * Dimens.grid24), + padding: EdgeInsets.only(right: _progress.value * Dimens.grid8), child: Icon( Icons.edit, size: _progress.value * Dimens.grid24, diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index 3120b38..0168608 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; +import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfilesScreen extends StatefulWidget { @@ -44,30 +45,38 @@ class _EquipmentProfilesScreenState extends State { icon: const Icon(Icons.close), ), ], - slivers: [ - SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) => index > 0 - ? Padding( - padding: EdgeInsets.fromLTRB( - Dimens.paddingM, - index == 0 ? Dimens.paddingM : 0, - Dimens.paddingM, - Dimens.paddingM, - ), - child: EquipmentProfileContainer( - key: profileContainersKeys[index], - data: EquipmentProfiles.of(context)[index], - onExpand: () => _keepExpandedAt(index), - onUpdate: (profileData) => _updateProfileAt(profileData, index), - onDelete: () => _removeProfileAt(index), - ), - ) - : const SizedBox.shrink(), - childCount: profilesCount, - ), - ), - ], + slivers: profilesCount == 1 + ? [ + SliverFillRemaining( + hasScrollBody: false, + child: _EquipmentProfilesListPlaceholder(onTap: _addProfile), + ) + ] + : [ + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => index > 0 // skip default + ? Padding( + padding: EdgeInsets.fromLTRB( + Dimens.paddingM, + index == 0 ? Dimens.paddingM : 0, + Dimens.paddingM, + Dimens.paddingM, + ), + child: EquipmentProfileContainer( + key: profileContainersKeys[index], + data: EquipmentProfiles.of(context)[index], + onExpand: () => _keepExpandedAt(index), + onUpdate: (profileData) => _updateProfileAt(profileData, index), + onDelete: () => _removeProfileAt(index), + ), + ) + : const SizedBox.shrink(), + childCount: profilesCount, + ), + ), + SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)), + ], ); } @@ -99,3 +108,32 @@ class _EquipmentProfilesScreenState extends State { }); } } + +class _EquipmentProfilesListPlaceholder extends StatelessWidget { + final VoidCallback onTap; + + const _EquipmentProfilesListPlaceholder({required this.onTap}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: Dimens.sliverAppBarExpandedHeight), + child: FractionallySizedBox( + widthFactor: 1 / 1.618, + child: Center( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(Dimens.paddingL), + child: IconPlaceholder( + icon: Icons.add, + text: S.of(context).tapToAdd, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart index d1a6ef3..774e215 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart @@ -1,6 +1,10 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfilesListTile extends StatelessWidget { @@ -8,13 +12,31 @@ class EquipmentProfilesListTile extends StatelessWidget { @override Widget build(BuildContext context) { + final paidStatus = IAPProducts.productOf(context, IAPProductType.paidFeatures)?.status ?? + IAPProductStatus.pending; + log(paidStatus.toString()); return ListTile( leading: const Icon(Icons.camera), title: Text(S.of(context).equipmentProfiles), - onTap: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()), - ); + onTap: switch (paidStatus) { + IAPProductStatus.purchased => () { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()), + ); + }, + IAPProductStatus.pending => null, + _ => () { + IAPProductsProvider.of(context).buy(IAPProductType.paidFeatures); + }, + }, + trailing: switch (paidStatus) { + IAPProductStatus.purchasable => const Icon(Icons.lock), + IAPProductStatus.pending => const SizedBox( + height: Dimens.grid24, + width: Dimens.grid24, + child: CircularProgressIndicator(), + ), + _ => null, }, ); } diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart index c60abab..a043a12 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart @@ -33,18 +33,10 @@ class _MeteringScreenLayoutFeaturesDialogState extends State SwitchListTile( - contentPadding: EdgeInsets.symmetric(horizontal: Dimens.dialogTitlePadding.left), - title: Text(_toStringLocalized(context, f)), - value: _features[f]!, - onChanged: (value) { - setState(() { - _features.update(f, (_) => value); - }); - }, - ), - ), + _featureListTile(MeteringScreenLayoutFeature.equipmentProfiles), + _featureListTile(MeteringScreenLayoutFeature.extremeExposurePairs), + _featureListTile(MeteringScreenLayoutFeature.filmPicker), + _featureListTile(MeteringScreenLayoutFeature.histogram), ], ), ), @@ -65,8 +57,23 @@ class _MeteringScreenLayoutFeaturesDialogState extends State value); + }); + }, + ); + } + String _toStringLocalized(BuildContext context, MeteringScreenLayoutFeature feature) { switch (feature) { + case MeteringScreenLayoutFeature.equipmentProfiles: + return S.of(context).equipmentProfiles; case MeteringScreenLayoutFeature.extremeExposurePairs: return S.of(context).meteringScreenFeatureExtremeExposurePairs; case MeteringScreenLayoutFeature.filmPicker: diff --git a/lib/screens/settings/components/metering/widget_settings_section_metering.dart b/lib/screens/settings/components/metering/widget_settings_section_metering.dart index a033cbd..9f86709 100644 --- a/lib/screens/settings/components/metering/widget_settings_section_metering.dart +++ b/lib/screens/settings/components/metering/widget_settings_section_metering.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/features.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart'; import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart'; @@ -18,7 +17,7 @@ class MeteringSettingsSection extends StatelessWidget { StopTypeListTile(), CalibrationListTile(), MeteringScreenLayoutListTile(), - if (FeaturesConfig.equipmentProfilesEnabled) EquipmentProfilesListTile(), + EquipmentProfilesListTile(), ], ); } diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 9332d3f..38256e8 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -50,6 +50,7 @@ class _SettingsScreenState extends State { ], ), ), + SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)), ], ), ); diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart b/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart similarity index 68% rename from lib/screens/metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart rename to lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart index ea6728f..f11128a 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart +++ b/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart @@ -1,24 +1,30 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -class EmptyExposurePairsList extends StatelessWidget { - const EmptyExposurePairsList({super.key}); +class IconPlaceholder extends StatelessWidget { + final IconData icon; + final String text; + + const IconPlaceholder({ + required this.icon, + required this.text, + super.key, + }); @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width / 2), + constraints: BoxConstraints(maxWidth: MediaQuery.sizeOf(context).width / 2), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( - Icons.not_interested, + icon, color: Theme.of(context).colorScheme.onBackground, ), const SizedBox(height: Dimens.grid8), Text( - S.of(context).noExposurePairs, + text, style: Theme.of(context) .textTheme .bodyMedium diff --git a/lib/screens/shared/sliver_screen/screen_sliver.dart b/lib/screens/shared/sliver_screen/screen_sliver.dart index d4542b1..20d2e66 100644 --- a/lib/screens/shared/sliver_screen/screen_sliver.dart +++ b/lib/screens/shared/sliver_screen/screen_sliver.dart @@ -24,7 +24,7 @@ class SliverScreen extends StatelessWidget { SliverAppBar( pinned: true, automaticallyImplyLeading: false, - expandedHeight: Dimens.grid168, + expandedHeight: Dimens.sliverAppBarExpandedHeight, flexibleSpace: FlexibleSpaceBar( centerTitle: false, titlePadding: const EdgeInsets.all(Dimens.paddingM), @@ -39,7 +39,6 @@ class SliverScreen extends StatelessWidget { actions: appBarActions, ), ...slivers, - SliverToBoxAdapter(child: SizedBox(height: MediaQuery.of(context).padding.bottom)), ], ), ), diff --git a/lib/utils/log_2.dart b/lib/utils/log_2.dart deleted file mode 100644 index 37bcc92..0000000 --- a/lib/utils/log_2.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'dart:math'; - -double log2(num x) => log(x) / log(2); diff --git a/pubspec.yaml b/pubspec.yaml index f8ba217..0a2bfb6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: lightmeter -description: A new Flutter project. +description: Lightmeter app inspired by Material 3 design system. publish_to: "none" version: 0.13.2+38 @@ -11,10 +11,10 @@ dependencies: bloc_concurrency: 0.2.2 camera: 0.10.5+2 clipboard: 0.1.3 - dynamic_color: 1.6.5 + dynamic_color: 1.6.6 exif: 3.1.4 - firebase_core: 2.13.0 - firebase_crashlytics: 3.3.1 + firebase_core: 2.14.0 + firebase_crashlytics: 3.3.3 flutter: sdk: flutter flutter_bloc: 8.1.3 @@ -23,22 +23,26 @@ dependencies: intl: 0.18.0 intl_utils: 2.8.2 light_sensor: 2.0.2 + m3_lightmeter_iap: + git: + url: "https://github.com/vodemn/m3_lightmeter_iap" + ref: main m3_lightmeter_resources: git: url: "https://github.com/vodemn/m3_lightmeter_resources" ref: main material_color_utilities: 0.2.0 - package_info_plus: 4.0.1 - permission_handler: 10.2.0 + package_info_plus: 4.0.2 + permission_handler: 10.4.3 platform: 3.1.0 - shared_preferences: 2.1.1 - url_launcher: 6.1.11 + shared_preferences: 2.2.0 + url_launcher: 6.1.12 uuid: 3.0.7 - vibration: 1.7.7 + vibration: 1.8.1 dev_dependencies: bloc_test: 9.1.3 - build_runner: ^2.1.7 + build_runner: 2.4.6 flutter_launcher_icons: 0.11.0 flutter_native_splash: 2.2.16 flutter_test: diff --git a/test/data/models/metering_screen_layout_config_test.dart b/test/data/models/metering_screen_layout_config_test.dart index d763b08..9e9393e 100644 --- a/test/data/models/metering_screen_layout_config_test.dart +++ b/test/data/models/metering_screen_layout_config_test.dart @@ -12,12 +12,31 @@ void main() { '0': true, '1': true, '2': true, + '3': true, }, ), { MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, MeteringScreenLayoutFeature.histogram: true, + MeteringScreenLayoutFeature.equipmentProfiles: true, + }, + ); + }); + + test('Legacy (no histogram & equipment profiles)', () { + expect( + MeteringScreenLayoutConfigJson.fromJson( + { + '0': false, + '1': false, + }, + ), + { + MeteringScreenLayoutFeature.extremeExposurePairs: false, + MeteringScreenLayoutFeature.filmPicker: false, + MeteringScreenLayoutFeature.histogram: true, + MeteringScreenLayoutFeature.equipmentProfiles: true, }, ); }); @@ -26,28 +45,32 @@ void main() { expect( MeteringScreenLayoutConfigJson.fromJson( { - '0': true, - '1': true, + '0': false, + '1': false, + '2': false, }, ), { - MeteringScreenLayoutFeature.extremeExposurePairs: true, - MeteringScreenLayoutFeature.filmPicker: true, - MeteringScreenLayoutFeature.histogram: true, + MeteringScreenLayoutFeature.extremeExposurePairs: false, + MeteringScreenLayoutFeature.filmPicker: false, + MeteringScreenLayoutFeature.histogram: false, + MeteringScreenLayoutFeature.equipmentProfiles: true, }, ); }); }, ); - test('toJson', () { + test('toJson()', () { expect( { + MeteringScreenLayoutFeature.equipmentProfiles: true, MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, MeteringScreenLayoutFeature.histogram: true, }.toJson(), { + '3': true, '0': true, '1': true, '2': true, diff --git a/test/data/shared_prefs_service_test.dart b/test/data/shared_prefs_service_test.dart index 692cb81..2a63fe5 100644 --- a/test/data/shared_prefs_service_test.dart +++ b/test/data/shared_prefs_service_test.dart @@ -193,6 +193,7 @@ void main() { { MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, + MeteringScreenLayoutFeature.equipmentProfiles: true, MeteringScreenLayoutFeature.histogram: true, }, ); @@ -207,6 +208,7 @@ void main() { { MeteringScreenLayoutFeature.extremeExposurePairs: false, MeteringScreenLayoutFeature.filmPicker: true, + MeteringScreenLayoutFeature.equipmentProfiles: true, MeteringScreenLayoutFeature.histogram: true, }, ); @@ -216,18 +218,19 @@ void main() { when( () => sharedPreferences.setString( UserPreferencesService.meteringScreenLayoutKey, - """{"0":false,"1":true,"2":true}""", + """{"0":false,"1":true,"2":true,"3":true}""", ), ).thenAnswer((_) => Future.value(true)); service.meteringScreenLayout = { MeteringScreenLayoutFeature.extremeExposurePairs: false, MeteringScreenLayoutFeature.filmPicker: true, MeteringScreenLayoutFeature.histogram: true, + MeteringScreenLayoutFeature.equipmentProfiles: true, }; verify( () => sharedPreferences.setString( UserPreferencesService.meteringScreenLayoutKey, - """{"0":false,"1":true,"2":true}""", + """{"0":false,"1":true,"2":true,"3":true}""", ), ).called(1); }); diff --git a/test/screens/metering/screen_metering_test.dart b/test/screens/metering/screen_metering_test.dart new file mode 100644 index 0000000..bb50168 --- /dev/null +++ b/test/screens/metering/screen_metering_test.dart @@ -0,0 +1,966 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/data/models/film.dart'; +import 'package:lightmeter/screens/metering/screen_metering.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +void main() { + const defaultEquipmentProfile = EquipmentProfile( + id: "", + name: 'Default', + apertureValues: ApertureValue.values, + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values, + isoValues: IsoValue.values, + ); + + group('Empty list', () { + List exposurePairsFull(double ev) => MeteringContainerBuidler.buildExposureValues( + ev, + StopType.full, + defaultEquipmentProfile, + const Film.other(), + ); + + test('isNan', () { + expect(exposurePairsFull(double.nan), const []); + }); + + test('isInifinity', () { + expect(exposurePairsFull(double.infinity), const []); + }); + + test('Big ass number', () { + expect(exposurePairsFull(23), const []); + }); + }); + + group('Default equipment profile', () { + group("StopType.full", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.full, + defaultEquipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + + group("StopType.half", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.half, + defaultEquipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + + group("StopType.third", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.third, + defaultEquipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2.5, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.3, StopType.third), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(7.1, StopType.third), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(7.1, StopType.third), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + }); + + group('Shutter speed 1/1000-1/2"', () { + final equipmentProfile = EquipmentProfile( + id: "1", + name: 'Test1', + apertureValues: ApertureValue.values, + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values.sublist( + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(2, true, StopType.full)) + 1, + ), + isoValues: IsoValue.values, + ); + + group("StopType.full", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.full, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + }); + + group("StopType.half", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.half, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.2, StopType.half), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.2, StopType.half), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.2, StopType.half), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + }); + + group("StopType.third", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.third, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2.5, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.1, StopType.third), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.2, StopType.third), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.2, StopType.third), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ); + }); + }); + }); + + group('Shutter speed 2"-16"', () { + final equipmentProfile = EquipmentProfile( + id: "1", + name: 'Test1', + apertureValues: ApertureValue.values.sublist(4), + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values.sublist( + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(2, false, StopType.full)), + ), + isoValues: IsoValue.values, + ); + + group("StopType.full", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.full, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.0, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.0, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.8, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.8, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.8, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + + group("StopType.half", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.half, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.0, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.4, StopType.half), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.4, StopType.half), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.4, StopType.half), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.7, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.8, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + + group("StopType.third", () { + List exposurePairsFull(double ev) => + MeteringContainerBuidler.buildExposureValues( + ev, + StopType.third, + equipmentProfile, + const Film.other(), + ); + + test('EV 1', () { + final exposurePairs = exposurePairsFull(1); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.0, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(5.6, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.3', () { + final exposurePairs = exposurePairsFull(1.3); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.2, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(6.3, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.5', () { + final exposurePairs = exposurePairsFull(1.5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.4, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(7.1, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 1.7', () { + final exposurePairs = exposurePairsFull(1.7); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.4, StopType.full), + ShutterSpeedValue(2, false, StopType.third), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(7.1, StopType.third), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + + test('EV 2', () { + final exposurePairs = exposurePairsFull(2); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(2.8, StopType.full), + ShutterSpeedValue(2, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(8, StopType.full), + ShutterSpeedValue(16, false, StopType.full), + ), + ); + }); + }); + }); +} From da4fcfc85769f432e692d44bb9458857d22d9047 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sat, 2 Sep 2023 12:45:57 +0200 Subject: [PATCH 30/49] Fixed IAP stub in workflows (#110) * try using script for iap stub * typo * typo * typo * removed working dir * added comment to stub_iap.sh * checkout first * increment build number by script * Update increment_build_number.sh * fixed iap repo * stub --- .github/scripts/increment_build_number.sh | 8 ++++++++ .github/scripts/stub_iap.sh | 2 ++ .github/workflows/build_apk.yml | 13 ++++++------- .github/workflows/create_release.yml | 15 +++++++-------- .github/workflows/pr_check.yml | 19 +++++++------------ iap/lib/src/data/models/iap_product.dart | 12 ++++++++++-- .../src/providers/iap_products_provider.dart | 2 +- 7 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 .github/scripts/increment_build_number.sh create mode 100644 .github/scripts/stub_iap.sh diff --git a/.github/scripts/increment_build_number.sh b/.github/scripts/increment_build_number.sh new file mode 100644 index 0000000..520455f --- /dev/null +++ b/.github/scripts/increment_build_number.sh @@ -0,0 +1,8 @@ +export newVersion="$1" + +if [[ -n "$newVersion" ]]; then + #https://stackoverflow.com/a/30214769/13167574 + perl -i -pe 's/^(version:\s+)(\d+\.\d+\.\d+)(\+)(\d+)$/$1.$ENV{'newVersion'}.$3.($4+1)/e' pubspec.yaml +else + echo "argument error" +fi diff --git a/.github/scripts/stub_iap.sh b/.github/scripts/stub_iap.sh new file mode 100644 index 0000000..210e1ea --- /dev/null +++ b/.github/scripts/stub_iap.sh @@ -0,0 +1,2 @@ +# https://unix.stackexchange.com/questions/435708/regex-multiline-pattern-and-substitution-replacement +perl -0777 -i -pe 's/( m3_lightmeter_iap:\n)( git:\n url: "https:\/\/github.com\/vodemn\/m3_lightmeter_iap"\n ref: main)/$1 path: iap/sg' pubspec.yaml \ No newline at end of file diff --git a/.github/workflows/build_apk.yml b/.github/workflows/build_apk.yml index e61b38b..6acb464 100644 --- a/.github/workflows/build_apk.yml +++ b/.github/workflows/build_apk.yml @@ -27,6 +27,10 @@ jobs: runs-on: macos-11 timeout-minutes: 15 steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Connect private iap package uses: webfactory/ssh-agent@v0.8.0 if: ${{ inputs.include-iap }} @@ -35,13 +39,8 @@ jobs: - name: Override iap package with stub if: ${{ !inputs.include-iap }} - run: | - echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml - - - uses: actions/checkout@v3 - with: - submodules: recursive - + run: bash ./.github/scripts/stub_iap.sh + - uses: actions/setup-java@v2 with: distribution: "zulu" diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index e0281e3..69a672b 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -46,6 +46,10 @@ jobs: runs-on: macos-11 timeout-minutes: 30 steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Connect private iap package uses: webfactory/ssh-agent@v0.8.0 if: ${{ inputs.include-iap }} @@ -54,12 +58,7 @@ jobs: - name: Override iap package with stub if: ${{ !inputs.include-iap }} - run: | - echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml - - - uses: actions/checkout@v3 - with: - submodules: recursive + run: bash ./.github/scripts/stub_iap.sh - uses: actions/setup-java@v3 with: @@ -98,7 +97,7 @@ jobs: # Therefore here we have to increment it as well to build an apk with the same build number. - name: Increment build number & replace version number if: ${{ inputs.github-release }} - run: perl -i -pe 's/^(version:\s+)(\d+\.\d+\.\d+)(\+)(\d+)$/$1."${{ github.event.inputs.version }}".$3.($4+1)/e' pubspec.yaml + run: bash ./.github/scripts/increment_build_number.sh ${{ github.event.inputs.version }} - name: Install Flutter uses: subosito/flutter-action@v2 @@ -160,7 +159,7 @@ jobs: submodules: recursive - name: Increment build number & replace version number - run: perl -i -pe 's/^(version:\s+)(\d+\.\d+\.\d+)(\+)(\d+)$/$1."${{ github.event.inputs.version }}".$3.($4+1)/e' pubspec.yaml + run: bash ./.github/scripts/increment_build_number.sh ${{ github.event.inputs.version }} - name: Commit changes run: | diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index e6f0294..70e6fa4 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -11,30 +11,25 @@ on: pull_request: branches: ["main"] -env: - # Stub iap package if this worlflow is running from the PR from a fork - STUB_IAP: ${{ github.event.pull_request.head.repo.full_name != github.repository }} - jobs: analyze_and_test: name: Analyze & test runs-on: macos-11 timeout-minutes: 10 steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Connect private iap package uses: webfactory/ssh-agent@v0.8.0 - if: !env.STUB_IAP + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} with: ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }} - name: Override iap package with stub - if: env.STUB_IAP - run: | - echo "\ndependency_overrides:\n m3_lightmeter_iap:\n path: iap" >> pubspec.yaml - - - uses: actions/checkout@v3 - with: - submodules: recursive + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + run: bash ./.github/scripts/stub_iap.sh - uses: subosito/flutter-action@v2 with: diff --git a/iap/lib/src/data/models/iap_product.dart b/iap/lib/src/data/models/iap_product.dart index 706e3f1..ba24c17 100644 --- a/iap/lib/src/data/models/iap_product.dart +++ b/iap/lib/src/data/models/iap_product.dart @@ -1,5 +1,13 @@ +enum IAPProductStatus { + purchasable, + pending, + purchased, +} + enum IAPProductType { paidFeatures } -class IAPProduct { - IAPProduct(); +abstract class IAPProduct { + const IAPProduct._(); + + IAPProductStatus get status => IAPProductStatus.purchasable; } diff --git a/iap/lib/src/providers/iap_products_provider.dart b/iap/lib/src/providers/iap_products_provider.dart index 4ea3c98..3014cd9 100644 --- a/iap/lib/src/providers/iap_products_provider.dart +++ b/iap/lib/src/providers/iap_products_provider.dart @@ -35,7 +35,7 @@ class IAPProducts extends InheritedModel { super.key, }); - static IAPProduct? of(BuildContext context, IAPProductType type) => null; + static IAPProduct? productOf(BuildContext context, IAPProductType type) => null; static bool isPurchased(BuildContext context, IAPProductType type) => false; From bf3c8aa7c7396238ae01a43ed6619c83b506e093 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sat, 2 Sep 2023 13:08:58 +0200 Subject: [PATCH 31/49] Fixed _Build .apk_ flow --- .github/workflows/build_apk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_apk.yml b/.github/workflows/build_apk.yml index 6acb464..d39bd31 100644 --- a/.github/workflows/build_apk.yml +++ b/.github/workflows/build_apk.yml @@ -86,10 +86,10 @@ jobs: flutter pub get flutter pub run intl_utils:generate - - name: Build Apk + - name: Build .apk env: FLAVOR: ${{ github.event.inputs.flavor }} - run: flutter build apk --release --flavor $FLAVOR --dart-define c -t lib/main_$FLAVOR.dart + run: flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_$FLAVOR.dart - name: Upload artifact uses: actions/upload-artifact@v3 From f39177919ce9d7b2ce8f65da22b0640b8e5cc102 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sat, 2 Sep 2023 22:29:35 +0200 Subject: [PATCH 32/49] Equipment profiles issues (#112) * Fixed equipment profiles sections collapsing * Fixed range picker dialog * Refined equipment profiles sections handling --- .../widget_dialog_picker_range.dart | 4 +- .../widget_container_equipment_profile.dart | 11 ++- .../screen_equipment_profile.dart | 96 ++++++++++++------- 3 files changed, 70 insertions(+), 41 deletions(-) diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart index 24f684a..cc3f4ca 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart @@ -68,8 +68,8 @@ class _DialogRangePickerState extends State widget.onExpand(); _controller.forward(); SchedulerBinding.instance.addPostFrameCallback((_) { - Scrollable.ensureVisible( - context, - alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd, - ); + Future.delayed(_controller.duration!).then((_) { + Scrollable.ensureVisible( + context, + alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd, + duration: _controller.duration!, + ); + }); }); } diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index 0168608..5307145 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -17,17 +17,13 @@ class EquipmentProfilesScreen extends StatefulWidget { } class _EquipmentProfilesScreenState extends State { - static const maxProfiles = 5 + 1; // replace with a constant from iap - - late List> profileContainersKeys = []; - int get profilesCount => EquipmentProfiles.of(context).length; + final Map> keysMap = {}; + int get profilesCount => keysMap.length; @override void didChangeDependencies() { super.didChangeDependencies(); - profileContainersKeys = EquipmentProfiles.of(context) - .map((e) => GlobalKey(debugLabel: e.id)) - .toList(); + _updateProfilesKeys(); } @override @@ -35,11 +31,10 @@ class _EquipmentProfilesScreenState extends State { return SliverScreen( title: S.of(context).equipmentProfiles, appBarActions: [ - if (profilesCount < maxProfiles) - IconButton( - onPressed: _addProfile, - icon: const Icon(Icons.add), - ), + IconButton( + onPressed: _addProfile, + icon: const Icon(Icons.add), + ), IconButton( onPressed: Navigator.of(context).pop, icon: const Icon(Icons.close), @@ -55,24 +50,30 @@ class _EquipmentProfilesScreenState extends State { : [ SliverList( delegate: SliverChildBuilderDelegate( - (context, index) => index > 0 // skip default - ? Padding( - padding: EdgeInsets.fromLTRB( - Dimens.paddingM, - index == 0 ? Dimens.paddingM : 0, - Dimens.paddingM, - Dimens.paddingM, - ), - child: EquipmentProfileContainer( - key: profileContainersKeys[index], - data: EquipmentProfiles.of(context)[index], - onExpand: () => _keepExpandedAt(index), - onUpdate: (profileData) => _updateProfileAt(profileData, index), - onDelete: () => _removeProfileAt(index), - ), - ) - : const SizedBox.shrink(), - childCount: profilesCount, + (context, index) { + if (index == 0) { + // skip default profile + return const SizedBox.shrink(); + } + + final profile = EquipmentProfiles.of(context)[index]; + return Padding( + padding: EdgeInsets.fromLTRB( + Dimens.paddingM, + index == 0 ? Dimens.paddingM : 0, + Dimens.paddingM, + Dimens.paddingM, + ), + child: EquipmentProfileContainer( + key: keysMap[profile.id], + data: profile, + onExpand: () => _keepExpandedAt(index), + onUpdate: _updateProfileAt, + onDelete: () => _removeProfileAt(profile), + ), + ); + }, + childCount: EquipmentProfiles.of(context).length, ), ), SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)), @@ -91,22 +92,47 @@ class _EquipmentProfilesScreenState extends State { }); } - void _updateProfileAt(EquipmentProfile data, int index) { + void _updateProfileAt(EquipmentProfile data) { EquipmentProfileProvider.of(context).updateProdile(data); } - void _removeProfileAt(int index) { - EquipmentProfileProvider.of(context).deleteProfile(EquipmentProfiles.of(context)[index]); + void _removeProfileAt(EquipmentProfile data) { + EquipmentProfileProvider.of(context).deleteProfile(data); } void _keepExpandedAt(int index) { - profileContainersKeys.getRange(0, index).forEach((element) { + keysMap.values.toList().getRange(0, index).forEach((element) { element.currentState?.collapse(); }); - profileContainersKeys.getRange(index + 1, profilesCount).forEach((element) { + keysMap.values.toList().getRange(index + 1, profilesCount).forEach((element) { element.currentState?.collapse(); }); } + + void _updateProfilesKeys() { + final profiles = EquipmentProfiles.of(context); + if (profiles.length > keysMap.length) { + // profile added + final List idsToAdd = []; + for (final profile in profiles) { + if (!keysMap.keys.contains(profile.id)) idsToAdd.add(profile.id); + } + for (final id in idsToAdd) { + keysMap[id] = GlobalKey(debugLabel: id); + } + idsToAdd.clear(); + } else if (profiles.length < keysMap.length) { + // profile deleted + final List idsToDelete = []; + for (final id in keysMap.keys) { + if (!profiles.any((p) => p.id == id)) idsToDelete.add(id); + } + idsToDelete.forEach(keysMap.remove); + idsToDelete.clear(); + } else { + // profile updated, no need to updated keys + } + } } class _EquipmentProfilesListPlaceholder extends StatelessWidget { From 429c0a53a21438f061555d22e00f2b9ac489d59f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 2 Sep 2023 21:13:17 +0000 Subject: [PATCH 33/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0a2bfb6..97beb09 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: Lightmeter app inspired by Material 3 design system. publish_to: "none" -version: 0.13.2+38 +version: 0.14.0+39 environment: sdk: ">=3.0.0 <4.0.0" From 4201d36abb202787691121ea48b3dbb38cde2e09 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 3 Sep 2023 13:06:30 +0200 Subject: [PATCH 34/49] Refined launch options --- .gitignore | 2 +- .vscode/launch.json | 66 ++++++++++++++++++++++++++++++------------- README.md | 11 ++++++-- lib/firebase.dart | 22 ++++++++++----- lib/main_prod.dart | 8 +----- lib/main_release.dart | 10 +++++++ 6 files changed, 82 insertions(+), 37 deletions(-) create mode 100644 lib/main_release.dart diff --git a/.gitignore b/.gitignore index ee0aebd..3fd9832 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,6 @@ keystore.properties android/app/google-services.json ios/firebase_app_id_file.json ios/Runner/GoogleService-Info.plist -lib/firebase_options.dart +/lib/firebase_options.dart coverage/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 6cbc2bc..40dbfac 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,9 +5,10 @@ "version": "0.2.0", "configurations": [ { - "name": "dev (android)", + "name": "dev-debug (android)", "request": "launch", "type": "dart", + "flutterMode": "debug", "args": [ "--flavor", "dev", @@ -17,9 +18,49 @@ "program": "${workspaceFolder}/lib/main_dev.dart", }, { - "name": "dev (ios)", + "name": "dev-profile (android)", "request": "launch", "type": "dart", + "flutterMode": "profile", + "args": [ + "--flavor", + "dev", + "--dart-define", + "cameraPreviewAspectRatio=240/320", + ], + "program": "${workspaceFolder}/lib/main_dev.dart", + }, + { + "name": "prod-debug (android)", + "request": "launch", + "type": "dart", + "flutterMode": "debug", + "args": [ + "--flavor", + "prod", + "--dart-define", + "cameraPreviewAspectRatio=240/320", + ], + "program": "${workspaceFolder}/lib/main_release.dart", + }, + { + "name": "prod-profile (android)", + "request": "launch", + "type": "dart", + "flutterMode": "profile", + "args": [ + "--flavor", + "prod", + "--dart-define", + "cameraPreviewAspectRatio=240/320", + ], + "program": "${workspaceFolder}/lib/main_release.dart", + }, + { + "name": "dev-debug (ios)", + "request": "launch", + "type": "dart", + "flutterMode": "debug", "args": [ "--flavor", "dev", @@ -29,30 +70,17 @@ "program": "${workspaceFolder}/lib/main_dev.dart", }, { - "name": "prod (android)", + "name": "dev-profile (ios)", "request": "launch", - //"flutterMode": "release", + "flutterMode": "profile", "type": "dart", "args": [ "--flavor", - "prod", - "--dart-define", - "cameraPreviewAspectRatio=240/320", - ], - "program": "${workspaceFolder}/lib/main_prod.dart", - }, - { - "name": "prod (ios)", - "request": "launch", - //"flutterMode": "release", - "type": "dart", - "args": [ - "--flavor", - "prod", + "dev", "--dart-define", "cameraPreviewAspectRatio=3/4", ], - "program": "${workspaceFolder}/lib/main_prod.dart", + "program": "${workspaceFolder}/lib/main_dev.dart", }, ], } \ No newline at end of file diff --git a/README.md b/README.md index c4af94a..08e5780 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,18 @@ flutter pub get flutter pub run intl_utils:generate ``` -### 4. Build (Android) +### 4. Build + +#### Android You can build an apk by running the following command from the root of the repository: ```console -flutter build apk --release --flavor $FLAVOR --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_$FLAVOR.dart +flutter build apk --release --flavor dev --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_dev.dart ``` -Just replace `$FLAVOR` with `dev` or `prod`. + +### iOS + +TBD # Contribution diff --git a/lib/firebase.dart b/lib/firebase.dart index f75ae90..0a0e6b0 100644 --- a/lib/firebase.dart +++ b/lib/firebase.dart @@ -1,14 +1,22 @@ +import 'dart:developer'; + import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/foundation.dart'; import 'package:lightmeter/firebase_options.dart'; -Future initializeFirebase() async { - await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; - PlatformDispatcher.instance.onError = (error, stack) { - FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); - return true; - }; +Future initializeFirebase({required bool handleErrors}) async { + try { + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + if (handleErrors) { + FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; + PlatformDispatcher.instance.onError = (error, stack) { + FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); + return true; + }; + } + } catch (e) { + log(e.toString()); + } } diff --git a/lib/main_prod.dart b/lib/main_prod.dart index fc1700a..2ccc397 100644 --- a/lib/main_prod.dart +++ b/lib/main_prod.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:lightmeter/application.dart'; import 'package:lightmeter/environment.dart'; @@ -7,10 +5,6 @@ import 'package:lightmeter/firebase.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - try { - await initializeFirebase(); - } catch (e) { - log(e.toString()); - } + await initializeFirebase(handleErrors: true); runApp(const Application(Environment.prod())); } diff --git a/lib/main_release.dart b/lib/main_release.dart new file mode 100644 index 0000000..b87dff8 --- /dev/null +++ b/lib/main_release.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/application.dart'; +import 'package:lightmeter/environment.dart'; +import 'package:lightmeter/firebase.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + await initializeFirebase(handleErrors: false); + runApp(const Application(Environment.prod())); +} From cf4373d854d7750dd365c1beb53aedbb404d9c7c Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Fri, 8 Sep 2023 22:25:13 +0200 Subject: [PATCH 35/49] Equipment profiles issues (#115) * update equipment profile from dialog * updated `MeteringScreenLayoutFeaturesDialog` translations --- lib/l10n/intl_en.arb | 1 + lib/l10n/intl_fr.arb | 1 + lib/l10n/intl_ru.arb | 1 + lib/l10n/intl_zh.arb | 1 + lib/screens/metering/screen_metering.dart | 10 +------- ...ialog_metering_screen_layout_features.dart | 23 +++++++++++++------ 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 925d280..3d3ec6b 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -36,6 +36,7 @@ "lightSensor": "Light sensor", "meteringScreenLayout": "Metering screen layout", "meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.", + "meteringScreenLayoutHintEquipmentProfiles": "Equipment profile picker", "meteringScreenFeatureExtremeExposurePairs": "Fastest & shortest exposure pairs", "meteringScreenFeatureFilmPicker": "Film picker", "meteringScreenFeatureHistogram": "Histogram", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index c199d1e..4c6f353 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -36,6 +36,7 @@ "lightSensor": "Capteur de lumière", "meteringScreenLayout": "Disposition de l'écran de mesure", "meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.", + "meteringScreenLayoutHintEquipmentProfiles": "Sélecteur de profil de l'équipement", "meteringScreenFeatureExtremeExposurePairs": "Paires d'exposition les plus rapides et les plus courtes", "meteringScreenFeatureFilmPicker": "Sélecteur de film", "meteringScreenFeatureHistogram": "Histogramme", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index d20c4bd..7a7c772 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -36,6 +36,7 @@ "lightSensor": "Датчик освещённости", "meteringScreenLayout": "Элементы главного экрана", "meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.", + "meteringScreenLayoutHintEquipmentProfiles": "Выбор профиля оборудования", "meteringScreenFeatureExtremeExposurePairs": "Длинная и короткая выдержки", "meteringScreenFeatureFilmPicker": "Выбор пленки", "meteringScreenFeatureHistogram": "Гистограмма", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 02bdf6c..8c4fb07 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -36,6 +36,7 @@ "lightSensor": "光传感器", "meteringScreenLayout": "布局", "meteringScreenLayoutHint": "隐藏不需要的元素,以免浪费曝光列表空间", + "meteringScreenLayoutHintEquipmentProfiles": "设备配置选择", "meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合", "meteringScreenFeatureFilmPicker": "胶片选择", "meteringScreenFeatureHistogram": "直方图", diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index e9a77b5..93d515e 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -84,15 +84,7 @@ class _InheritedListeners extends StatelessWidget { context.read().add(const FilmChangedEvent(Film.other())); } }, - child: MeteringScreenLayoutFeatureListener( - feature: MeteringScreenLayoutFeature.equipmentProfiles, - onDidChangeDependencies: (value) { - if (!value) { - EquipmentProfileProvider.of(context).setProfile(EquipmentProfiles.of(context).first); - } - }, - child: child, - ), + child: child, ), ); } diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart index a043a12..57aaf24 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart @@ -3,6 +3,7 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; class MeteringScreenLayoutFeaturesDialog extends StatefulWidget { const MeteringScreenLayoutFeaturesDialog({super.key}); @@ -25,18 +26,23 @@ class _MeteringScreenLayoutFeaturesDialogState extends State Date: Fri, 8 Sep 2023 23:46:31 +0200 Subject: [PATCH 36/49] ML-114 Metering container issues (#116) * fixed top bar cutout shape * update closed offset on layout change --- .../shape_top_bar_metering.dart | 119 ++++++++---------- .../widget_top_bar_metering.dart | 4 +- .../widget_dialog_animated.dart | 78 +++++++----- 3 files changed, 100 insertions(+), 101 deletions(-) diff --git a/lib/screens/metering/components/shared/metering_top_bar/shape_top_bar_metering.dart b/lib/screens/metering/components/shared/metering_top_bar/shape_top_bar_metering.dart index c8f04fa..acc5986 100644 --- a/lib/screens/metering/components/shared/metering_top_bar/shape_top_bar_metering.dart +++ b/lib/screens/metering/components/shared/metering_top_bar/shape_top_bar_metering.dart @@ -31,10 +31,23 @@ class MeteringTopBarShape extends CustomPainter { @override void paint(Canvas canvas, Size size) { final paint = Paint()..color = color; - final path = Path(); - const circularRadius = Radius.circular(Dimens.borderRadiusL); + late final Path path; if (appendixHeight == 0 || appendixWidth == 0) { - path.addRRect( + path = _drawNoAppendix(size, Dimens.borderRadiusL); + } else if (appendixHeight < 0) { + path = _drawAppendixOnLeft(size, Dimens.borderRadiusL); + canvas.scale(-1, 1); + canvas.translate(-size.width, 0); + } else { + path = _drawAppendixOnLeft(size, Dimens.borderRadiusL); + } + canvas.drawPath(path, paint); + } + + Path _drawNoAppendix(Size size, double bottomRadius) { + final circularRadius = Radius.circular(bottomRadius); + return Path() + ..addRRect( RRect.fromLTRBAndCorners( 0, 0, @@ -43,73 +56,51 @@ class MeteringTopBarShape extends CustomPainter { bottomLeft: circularRadius, bottomRight: circularRadius, ), - ); - } else if (appendixHeight < 0) { - // Left side with bottom corner - path.lineTo(0, size.height + appendixHeight - Dimens.borderRadiusL); - path.arcToPoint( - Offset(Dimens.borderRadiusL, size.height + appendixHeight), - radius: circularRadius, - clockwise: false, - ); + ) + ..close(); + } - // Bottom side with step - final allowedRadius = min(appendixHeight.abs() / 2, Dimens.borderRadiusL); - path.lineTo(appendixWidth - allowedRadius, size.height + appendixHeight); - path.arcToPoint( - Offset(appendixWidth, size.height + appendixHeight + allowedRadius), - radius: circularRadius, - ); - path.lineTo(appendixWidth, size.height - allowedRadius); - path.arcToPoint( - Offset(appendixWidth + allowedRadius, size.height), - radius: circularRadius, - clockwise: false, - ); + Path _drawAppendixOnLeft(Size size, double bottomRadius) { + final path = Path(); + final circularRadius = Radius.circular(bottomRadius); + final appendixHeight = this.appendixHeight.abs(); - // Right side with bottom corner - path.lineTo(size.width - Dimens.borderRadiusL, size.height); - path.arcToPoint( - Offset(size.width, size.height - Dimens.borderRadiusL), - radius: circularRadius, - clockwise: false, - ); - } else { - // Left side with bottom corner - path.lineTo(0, size.height - Dimens.borderRadiusL); - path.arcToPoint( - Offset(Dimens.borderRadiusL, size.height), - radius: circularRadius, - clockwise: false, - ); + // Left side with bottom corner + path.lineTo(0, size.height - bottomRadius); + path.arcToPoint( + Offset(bottomRadius, size.height), + radius: circularRadius, + clockwise: false, + ); - // Bottom side with step - final allowedRadius = min(appendixHeight.abs() / 2, Dimens.borderRadiusL); - path.relativeLineTo(appendixWidth - allowedRadius * 2, 0); - path.relativeArcToPoint( - Offset(allowedRadius, -allowedRadius), - radius: Radius.circular(allowedRadius), - rotation: 90, - clockwise: false, - ); - path.relativeLineTo(0, -appendixHeight + allowedRadius * 2); - path.relativeArcToPoint( - Offset(allowedRadius, -allowedRadius), - radius: Radius.circular(allowedRadius), - rotation: 90, - ); + // Bottom side with step + final allowedRadius = min(appendixHeight.abs() / 2, bottomRadius); + path.lineTo(appendixWidth - allowedRadius, size.height); + path.arcToPoint( + Offset(appendixWidth, size.height - allowedRadius), + radius: Radius.circular(allowedRadius), + rotation: 90, + clockwise: false, + ); + path.lineTo(appendixWidth, size.height - appendixHeight + allowedRadius); + path.arcToPoint( + Offset(appendixWidth + allowedRadius, size.height - appendixHeight), + radius: Radius.circular(allowedRadius), + rotation: 90, + ); + + // Right side with bottom corner + path.lineTo(size.width - bottomRadius, size.height - appendixHeight); + path.arcToPoint( + Offset(size.width, size.height - appendixHeight - bottomRadius), + radius: circularRadius, + clockwise: false, + ); - // Right side with bottom corner - path.lineTo(size.width - Dimens.borderRadiusL, size.height - appendixHeight); - path.arcToPoint( - Offset(size.width, size.height - appendixHeight - Dimens.borderRadiusL), - radius: circularRadius, - clockwise: false, - ); - } path.lineTo(size.width, 0); path.close(); - canvas.drawPath(path, paint); + + return path; } @override diff --git a/lib/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart b/lib/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart index 0682e7e..a005b85 100644 --- a/lib/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart +++ b/lib/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart @@ -20,9 +20,7 @@ class MeteringTopBar extends StatelessWidget { return CustomPaint( painter: MeteringTopBarShape( color: Theme.of(context).colorScheme.surface, - appendixWidth: appendixHeight > 0 - ? MediaQuery.of(context).size.width / 2 - Dimens.grid8 + Dimens.paddingM - : MediaQuery.of(context).size.width / 2 + Dimens.grid8 - Dimens.paddingM, + appendixWidth: MediaQuery.of(context).size.width / 2 - Dimens.grid8 / 2 + Dimens.paddingM, appendixHeight: appendixHeight, ), child: Padding( diff --git a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart b/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart index cea97da..72e770b 100644 --- a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart +++ b/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart @@ -22,15 +22,15 @@ class AnimatedDialog extends StatefulWidget { class AnimatedDialogState extends State with SingleTickerProviderStateMixin { final GlobalKey _key = GlobalKey(); - late final Size _closedSize; - late final Offset _closedOffset; + late Size _closedSize; + late Offset _closedOffset; late final AnimationController _animationController; late final CurvedAnimation _defaultCurvedAnimation; late final Animation _barrierColorAnimation; - late final SizeTween _sizeTween; - late final Animation _sizeAnimation; - late final Animation _offsetAnimation; + late SizeTween _sizeTween; + late Animation _sizeAnimation; + late Animation _offsetAnimation; late final Animation _borderRadiusAnimation; late final Animation _closedOpacityAnimation; late final Animation _openedOpacityAnimation; @@ -88,35 +88,7 @@ class AnimatedDialogState extends State with SingleTickerProvide ), ); - WidgetsBinding.instance.addPostFrameCallback((_) { - final mediaQuery = MediaQuery.of(context); - - _closedSize = _key.currentContext!.size!; - _sizeTween = SizeTween( - begin: _closedSize, - end: widget.openedSize ?? - Size( - mediaQuery.size.width - - mediaQuery.padding.horizontal - - Dimens.dialogMargin.horizontal, - mediaQuery.size.height - mediaQuery.padding.vertical - Dimens.dialogMargin.vertical, - ), - ); - _sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation); - - final renderBox = _key.currentContext!.findRenderObject()! as RenderBox; - _closedOffset = renderBox.localToGlobal(Offset.zero); - _offsetAnimation = SizeTween( - begin: Size( - _closedOffset.dx + _closedSize.width / 2, - _closedOffset.dy + _closedSize.height / 2, - ), - end: Size( - mediaQuery.size.width / 2, - mediaQuery.size.height / 2 + mediaQuery.padding.top / 2 - mediaQuery.padding.bottom / 2, - ), - ).animate(_defaultCurvedAnimation); - }); + _setClosedOffset(); } @override @@ -133,6 +105,12 @@ class AnimatedDialogState extends State with SingleTickerProvide ).animate(_defaultCurvedAnimation); } + @override + void didUpdateWidget(covariant AnimatedDialog oldWidget) { + super.didUpdateWidget(oldWidget); + _setClosedOffset(); + } + @override void dispose() { _animationController.dispose(); @@ -151,6 +129,38 @@ class AnimatedDialogState extends State with SingleTickerProvide ); } + void _setClosedOffset() { + WidgetsBinding.instance.addPostFrameCallback((_) { + final renderBox = _key.currentContext?.findRenderObject()! as RenderBox?; + if (renderBox != null) { + final size = MediaQuery.sizeOf(context); + final padding = MediaQuery.paddingOf(context); + _closedSize = _key.currentContext!.size!; + _sizeTween = SizeTween( + begin: _closedSize, + end: widget.openedSize ?? + Size( + size.width - padding.horizontal - Dimens.dialogMargin.horizontal, + size.height - padding.vertical - Dimens.dialogMargin.vertical, + ), + ); + _sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation); + + _closedOffset = renderBox.localToGlobal(Offset.zero); + _offsetAnimation = SizeTween( + begin: Size( + _closedOffset.dx + _closedSize.width / 2, + _closedOffset.dy + _closedSize.height / 2, + ), + end: Size( + size.width / 2, + size.height / 2 + padding.top / 2 - padding.bottom / 2, + ), + ).animate(_defaultCurvedAnimation); + } + }); + } + void _openDialog() { Navigator.of(context).push( PageRouteBuilder( From 1be7c3be48df5c91c4fce41df9f258e3e9224fd2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Sep 2023 22:03:01 +0000 Subject: [PATCH 37/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 97beb09..22d5ddb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: Lightmeter app inspired by Material 3 design system. publish_to: "none" -version: 0.14.0+39 +version: 0.14.1+40 environment: sdk: ">=3.0.0 <4.0.0" From cc9f162933eb5aa34615fb0c0d7ad329a1084580 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:59:16 +0200 Subject: [PATCH 38/49] ML-107 Films filter (#118) * added stub `FilmsProvider` * moved dialogs to the shared folder * typo * separated `EquipmentSettingsSection` * copy * `IAPBuilder` -> `IAPListTile` * moved `Film` to resources repo * fixed films selection * untied iso and selected film * removed film from exposure pairs building * indicate push/pull * copy * Update .gitignore * fixed extreme exposure pairs reciprocity display * sync with iap changes * sync iap stub with iap changes * added reciprocity description * added workspace file * Update .gitignore --- .github/workflows/pr_check.yml | 9 +- README.md | 25 +- iap/lib/m3_lightmeter_iap.dart | 10 +- .../providers/equipment_profile_provider.dart | 32 +-- iap/lib/src/providers/films_provider.dart | 65 +++++ .../src/providers/selectable_provider.dart | 29 +++ lib/data/models/film.dart | 235 ------------------ lib/data/shared_prefs_service.dart | 8 - lib/interactors/metering_interactor.dart | 4 - lib/l10n/intl_en.arb | 5 + lib/l10n/intl_fr.arb | 7 +- lib/l10n/intl_ru.arb | 5 + lib/l10n/intl_zh.arb | 7 +- lib/screens/metering/bloc_metering.dart | 45 ---- .../camera_preview/widget_camera_preview.dart | 78 ++++-- .../provider_container_camera.dart | 7 - .../widget_container_camera.dart | 7 - .../provider_container_light_sensor.dart | 7 - .../widget_container_light_sensor.dart | 7 - .../widget_list_exposure_pairs.dart | 4 +- .../widget_picker_equipment_profiles.dart | 30 +++ ...dget_container_extreme_exposure_pairs.dart | 40 +++ .../film_picker/widget_picker_film.dart | 53 ++++ .../iso_picker/widget_picker_iso.dart | 40 +++ .../nd_picker/widget_picker_nd.dart | 42 ++++ .../widget_dialog_animated.dart | 0 .../dialog_picker/widget_picker_dialog.dart | 0 .../widget_picker_dialog_animated.dart | 5 +- .../widget_container_reading_value.dart | 0 .../widget_container_readings.dart | 165 +----------- lib/screens/metering/event_metering.dart | 7 - lib/screens/metering/screen_metering.dart | 18 +- lib/screens/metering/state_metering.dart | 5 - .../utils/equipment_profile_listener.dart | 30 --- .../widget_list_tiles_equipments.dart | 4 +- .../widget_container_equipment_profile.dart | 4 +- .../widget_dialog_equipment_profile_name.dart | 0 .../screen_equipment_profile.dart | 4 +- .../widget_list_tile_equipment_profiles.dart | 22 ++ .../films/widget_list_tile_films.dart | 35 +++ .../widget_settings_section_equipment.dart | 20 ++ .../language/widget_list_tile_language.dart | 2 +- .../widget_list_tile_equipment_profiles.dart | 43 ---- .../widget_list_tile_fractional_stops.dart | 2 +- .../widget_settings_section_metering.dart | 2 - .../dialog_filter/widget_dialog_filter.dart | 7 +- .../widget_dialog_picker.dart | 0 .../widget_dialog_picker_range.dart | 0 .../iap_list_tile/widget_list_tile_iap.dart | 33 +++ .../widget_settings_section.dart | 35 +-- .../widget_list_tile_theme_type.dart | 2 +- lib/screens/settings/screen_settings.dart | 2 + m3_lightmeter.code-workspace | 11 + test/data/models/film_test.dart | 121 --------- test/data/shared_prefs_service_test.dart | 23 -- .../interactors/metering_interactor_test.dart | 14 -- test/screens/metering/bloc_metering_test.dart | 142 ----------- .../metering/screen_metering_test.dart | 11 - 58 files changed, 592 insertions(+), 978 deletions(-) create mode 100644 iap/lib/src/providers/films_provider.dart create mode 100644 iap/lib/src/providers/selectable_provider.dart delete mode 100644 lib/data/models/film.dart create mode 100644 lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart create mode 100644 lib/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart create mode 100644 lib/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart create mode 100644 lib/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart create mode 100644 lib/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart rename lib/screens/metering/components/shared/readings_container/components/{ => shared}/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart (100%) rename lib/screens/metering/components/shared/readings_container/components/{ => shared}/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart (100%) rename lib/screens/metering/components/shared/readings_container/components/{ => shared}/animated_dialog_picker/widget_picker_dialog_animated.dart (89%) rename lib/screens/metering/components/shared/readings_container/components/{ => shared}/reading_value_container/widget_container_reading_value.dart (100%) delete mode 100644 lib/screens/metering/utils/equipment_profile_listener.dart rename lib/screens/settings/components/{metering => equipment}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart (90%) rename lib/screens/settings/components/{metering => equipment}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart (94%) rename lib/screens/settings/components/{metering => equipment}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart (100%) rename lib/screens/settings/components/{metering => equipment}/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart (92%) create mode 100644 lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart create mode 100644 lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart create mode 100644 lib/screens/settings/components/equipment/widget_settings_section_equipment.dart delete mode 100644 lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart rename lib/screens/settings/components/{metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components => shared}/dialog_filter/widget_dialog_filter.dart (92%) rename lib/screens/settings/components/shared/{dialog_picker.dart => dialog_picker}/widget_dialog_picker.dart (100%) rename lib/screens/settings/components/{metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components => shared}/dialog_range_picker/widget_dialog_picker_range.dart (100%) create mode 100644 lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart create mode 100644 m3_lightmeter.code-workspace delete mode 100644 test/data/models/film_test.dart diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 70e6fa4..ac420da 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -15,7 +15,7 @@ jobs: analyze_and_test: name: Analyze & test runs-on: macos-11 - timeout-minutes: 10 + timeout-minutes: 5 steps: - uses: actions/checkout@v3 with: @@ -47,3 +47,10 @@ jobs: - name: Run tests run: flutter test + + - name: Analyze project source with stub + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + run: | + bash ./.github/scripts/stub_iap.sh + flutter pub get + flutter analyze lib --fatal-infos diff --git a/README.md b/README.md index 08e5780..dae7291 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,7 @@ Without further delay behold my new Lightmeter app inspired by Material You (a.k To build this app you need to install Flutter 3.10.0 stable. [How to install](https://docs.flutter.dev/get-started/install). -### 2. (Optional) Install Firebase - -Out of the box Firebase Crashlytics won't work. If you want to add Crashlytics to your local build please follow [this guide](https://firebase.google.com/docs/flutter/setup). - -### 3. Get packages +### 3. Project setup As part of the app's functionallity is in the private repo, you have to replace these lines in _pubspec.yaml_: @@ -47,24 +43,39 @@ m3_lightmeter_iap: url: "https://github.com/vodemn/m3_lightmeter_iap" ref: main ``` + with these: + ```yaml m3_lightmeter_iap: path: iap ``` -and run `flutter pub get` from the _iap/_ folder. + +You can do it simply by running the script: + +```console +sh .github/scripts/stub_iap.sh +``` + +> If you are using VSCode, you can open the workspace like so: _File -> Open Workspace from File -> m3_lightmeter.code-workspace_. Otherwise you have to run `flutter pub get` command from the iap folder. Then you can fetch all the neccessary dependencies and generate translation files by running the following commands: + ```console flutter pub get flutter pub run intl_utils:generate ``` -### 4. Build +### 4. (Optional) Install Firebase + +Out of the box Firebase Crashlytics won't work. If you want to add Crashlytics to your local build please follow [this guide](https://firebase.google.com/docs/flutter/setup). + +### 5. Build #### Android You can build an apk by running the following command from the root of the repository: + ```console flutter build apk --release --flavor dev --dart-define cameraPreviewAspectRatio=240/320 -t lib/main_dev.dart ``` diff --git a/iap/lib/m3_lightmeter_iap.dart b/iap/lib/m3_lightmeter_iap.dart index 8fe8aa5..171fe47 100644 --- a/iap/lib/m3_lightmeter_iap.dart +++ b/iap/lib/m3_lightmeter_iap.dart @@ -2,11 +2,13 @@ library m3_lightmeter_iap; import 'package:flutter/material.dart'; import 'package:m3_lightmeter_iap/src/providers/equipment_profile_provider.dart'; +import 'package:m3_lightmeter_iap/src/providers/films_provider.dart'; import 'package:m3_lightmeter_iap/src/providers/iap_products_provider.dart'; export 'src/data/models/iap_product.dart'; -export 'src/providers/equipment_profile_provider.dart' hide EquipmentProfilesAspect; +export 'src/providers/equipment_profile_provider.dart'; +export 'src/providers/films_provider.dart'; export 'src/providers/iap_products_provider.dart'; class IAPProviders extends StatelessWidget { @@ -22,8 +24,10 @@ class IAPProviders extends StatelessWidget { @override Widget build(BuildContext context) { return IAPProductsProvider( - child: EquipmentProfileProvider( - child: child, + child: FilmsProvider( + child: EquipmentProfileProvider( + child: child, + ), ), ); } diff --git a/iap/lib/src/providers/equipment_profile_provider.dart b/iap/lib/src/providers/equipment_profile_provider.dart index 4f7aa0f..92ba8a2 100644 --- a/iap/lib/src/providers/equipment_profile_provider.dart +++ b/iap/lib/src/providers/equipment_profile_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/providers/selectable_provider.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileProvider extends StatefulWidget { @@ -27,7 +28,7 @@ class EquipmentProfileProviderState extends State { @override Widget build(BuildContext context) { return EquipmentProfiles( - profiles: const [_defaultProfile], + values: const [_defaultProfile], selected: _defaultProfile, child: widget.child, ); @@ -42,38 +43,19 @@ class EquipmentProfileProviderState extends State { void deleteProfile(EquipmentProfile data) {} } -enum EquipmentProfilesAspect { list, selected } - -class EquipmentProfiles extends InheritedModel { +class EquipmentProfiles extends SelectableInheritedModel { const EquipmentProfiles({ super.key, - required this.profiles, - required this.selected, + required super.values, + required super.selected, required super.child, }); - final List profiles; - final EquipmentProfile selected; - static List of(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.list, - )! - .profiles; + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.list)!.values; } static EquipmentProfile selectedOf(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.selected, - )! - .selected; + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.selected)!.selected; } - - @override - bool updateShouldNotify(EquipmentProfiles oldWidget) => false; - - @override - bool updateShouldNotifyDependent(EquipmentProfiles oldWidget, Set dependencies) => false; } diff --git a/iap/lib/src/providers/films_provider.dart b/iap/lib/src/providers/films_provider.dart new file mode 100644 index 0000000..e75ccd3 --- /dev/null +++ b/iap/lib/src/providers/films_provider.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/providers/selectable_provider.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class FilmsProvider extends StatefulWidget { + final Widget child; + + const FilmsProvider({ + required this.child, + super.key, + }); + + static FilmsProviderState of(BuildContext context) { + return context.findAncestorStateOfType()!; + } + + @override + State createState() => FilmsProviderState(); +} + +class FilmsProviderState extends State { + @override + Widget build(BuildContext context) { + return Films( + values: const [Film.other()], + filmsInUse: const [Film.other()], + selected: const Film.other(), + child: widget.child, + ); + } + + void setFilm(Film film) {} + + void saveFilms(List films) {} +} + +class Films extends SelectableInheritedModel { + final List filmsInUse; + + const Films({ + super.key, + required super.values, + required this.filmsInUse, + required super.selected, + required super.child, + }); + + /// [Film.other()] + all the custom fields with actual reciprocity formulas + static List of(BuildContext context) { + return InheritedModel.inheritFrom(context)!.values; + } + + /// [Film.other()] + films in use selected by user + static List inUseOf(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: SelectableAspect.list, + )! + .filmsInUse; + } + + static Film selectedOf(BuildContext context) { + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.selected)!.selected; + } +} diff --git a/iap/lib/src/providers/selectable_provider.dart b/iap/lib/src/providers/selectable_provider.dart new file mode 100644 index 0000000..c18f998 --- /dev/null +++ b/iap/lib/src/providers/selectable_provider.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +enum SelectableAspect { list, selected } + +class SelectableInheritedModel extends InheritedModel { + const SelectableInheritedModel({ + super.key, + required this.values, + required this.selected, + required super.child, + }); + + final List values; + final T selected; + + @override + bool updateShouldNotify(SelectableInheritedModel oldWidget) => true; + + @override + bool updateShouldNotifyDependent(SelectableInheritedModel oldWidget, Set dependencies) { + if (dependencies.contains(SelectableAspect.list)) { + return true; + } else if (dependencies.contains(SelectableAspect.selected)) { + return selected != oldWidget.selected; + } else { + return false; + } + } +} diff --git a/lib/data/models/film.dart b/lib/data/models/film.dart deleted file mode 100644 index ab651e8..0000000 --- a/lib/data/models/film.dart +++ /dev/null @@ -1,235 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/foundation.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; - -double log10(double x) => log(x) / log(10); - -double log10polynomian( - double x, - double a, - double b, - double c, -) => - a * pow(log10(x), 2) + b * log10(x) + c; - -typedef ReciprocityFailureBuilder = ShutterSpeedValue Function(ShutterSpeedValue shutterSpeed); - -/// Only Ilford films have reciprocity formulas provided by the manufacturer: -/// https://www.ilfordphoto.com/wp/wp-content/uploads/2017/06/Reciprocity-Failure-Compensation.pdf -/// -/// Reciprocity formulas for Fomapan films and Kodak films are from here: -/// https://www.flickr.com/groups/86738082@N00/discuss/72157626050157470/ -/// -/// Cinema films like Kodak 5222/7222 Double-X and respective CineStill films (cause they are basically a modification of Kodak) -/// do not have any reciprocity failure information, as these films are ment to be used in cinema -/// with appropriate light and pretty short shutter speeds. -/// -/// Because of this: https://github.com/dart-lang/sdk/issues/38934#issuecomment-803938315 -/// `super` calls are ignored in test coverage -class Film { - final String name; - final int iso; - - const Film(this.name, this.iso); - - const Film.other() - : name = '', - iso = 0; - - @override - String toString() => name; - - ShutterSpeedValue reciprocityFailure(ShutterSpeedValue shutterSpeed) { - if (shutterSpeed.isFraction) { - return shutterSpeed; - } else { - return ShutterSpeedValue( - reciprocityFormula(shutterSpeed.rawValue), - shutterSpeed.isFraction, - shutterSpeed.stopType, - ); - } - } - - @protected - double reciprocityFormula(double t) => t; - - static const List values = [ - Film.other(), - FomapanFilm.creative100(), - FomapanFilm.creative200(), - FomapanFilm.action400(), - IlfordFilm.ortho(), - IlfordFilm.delta100(), - IlfordFilm.delta400(), - IlfordFilm.delta3200(), - IlfordFilm.fp4(), - IlfordFilm.hp5(), - IlfordFilm.panf(), - IlfordFilm.sfx200(), - IlfordFilm.xp2super(), - IlfordFilm.pan100(), - IlfordFilm.pan400(), - KodakFilm.tmax100(), - KodakFilm.tmax400(), - KodakFilm.tmax3200(), - KodakFilm.trix320(), - KodakFilm.trix400(), - ]; -} - -/// https://www.tate.org.uk/documents/598/page_6_7_agfa_stocks_0.pdf -/// https://www.filmwasters.com/forum/index.php?topic=5298.0 -// {{1,1.87},{2,3.73},{3,8.06},{4,13.93},{5,21.28},{6,23.00},{7,30.12},{8,38.05},{9,44.75},{10,50.12},{20,117},{30,202},{40,293},{50,413},{60,547},{70,694},{80,853},{90,1022},{100,1202}}; -// class AgfaFilm extends Film { -// final double a; -// final double b; -// final double c; - -// const AgfaFilm.apx100() -// : a = 1, -// b = 5, -// c = 2, -// super('Agfa APX 100', 100); // coverage:ignore-line - -// const AgfaFilm.apx400() -// : a = 1.5, -// b = 4.5, -// c = 3, -// super('Agfa APX 400', 400); // coverage:ignore-line - -// @override -// double reciprocityFormula(double t) => t * log10polynomian(t, a, b, c); -// } - -class FomapanFilm extends Film { - final double a; - final double b; - final double c; - - /// https://www.foma.cz/en/fomapan-100 - const FomapanFilm.creative100() - : a = 1, - b = 5, - c = 2, - super('Fomapan CREATIVE 100', 100); // coverage:ignore-line - - /// https://www.foma.cz/en/fomapan-200 - const FomapanFilm.creative200() - : a = 1.5, - b = 4.5, - c = 3, - super('Fomapan CREATIVE 200', 200); // coverage:ignore-line - - /// https://www.foma.cz/en/fomapan-100 - const FomapanFilm.action400() - : a = -1.25, // coverage:ignore-line - b = 5.75, - c = 1.5, - super('Fomapan ACTION 400', 400); // coverage:ignore-line - - @override - double reciprocityFormula(double t) => t * log10polynomian(t, a, b, c); -} - -class IlfordFilm extends Film { - final double reciprocityPower; - - /// https://www.ilfordphoto.com/amfile/file/download/file/1948/product/1650/ - const IlfordFilm.ortho() - : reciprocityPower = 1.25, - super('Ilford ORTHO+', 80); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1919/product/686/ - const IlfordFilm.fp4() - : reciprocityPower = 1.26, - super('Ilford FP4+', 125); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1903/product/691/ - const IlfordFilm.hp5() - : reciprocityPower = 1.31, - super('Ilford HP5+', 400); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/3/product/679/ - const IlfordFilm.delta100() - : reciprocityPower = 1.26, - super('Ilford DELTA 100', 100); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1915/product/684/ - const IlfordFilm.delta400() - : reciprocityPower = 1.41, - super('Ilford DELTA 400', 400); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1913/product/682/ - const IlfordFilm.delta3200() - : reciprocityPower = 1.33, - super('Ilford DELTA 3200', 3200); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1905/product/699/ - const IlfordFilm.panf() - : reciprocityPower = 1.33, - super('Ilford Pan F+', 50); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1907/product/701/ - const IlfordFilm.sfx200() - : reciprocityPower = 1.31, - super('Ilford SFX 200', 200); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1909/product/703/ - const IlfordFilm.xp2super() - : reciprocityPower = 1.31, - super('Ilford XP2 SUPER', 400); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1958/product/696/ - const IlfordFilm.pan100() - : reciprocityPower = 1.26, - super('Kentemere 100', 100); // coverage:ignore-line - - /// https://www.ilfordphoto.com/amfile/file/download/file/1959/product/697/ - const IlfordFilm.pan400() - : reciprocityPower = 1.30, - super('Kentemere 400', 400); // coverage:ignore-line - - @override - double reciprocityFormula(double t) => pow(t, reciprocityPower).toDouble(); -} - -class KodakFilm extends Film { - final double a; - final double b; - final double c; - - const KodakFilm.tmax100() - : a = 1 / 6, // coverage:ignore-line - b = 0, // coverage:ignore-line - c = 4 / 3, // coverage:ignore-line - super('Kodak T-MAX 100', 100); // coverage:ignore-line - - const KodakFilm.tmax400() - : a = 2 / 3, // coverage:ignore-line - b = -1 / 2, // coverage:ignore-line - c = 4 / 3, // coverage:ignore-line - super('Kodak T-MAX 400', 400); // coverage:ignore-line - - const KodakFilm.tmax3200() - : a = 7 / 6, // coverage:ignore-line - b = -1, // coverage:ignore-line - c = 4 / 3, // coverage:ignore-line - super('Kodak T-MAX 3200', 3200); // coverage:ignore-line - - const KodakFilm.trix320() - : a = 2, - b = 1, - c = 2, - super('Kodak TRI-X 320', 320); // coverage:ignore-line - - const KodakFilm.trix400() - : a = 2, - b = 1, - c = 2, - super('Kodak TRI-X 400', 400); // coverage:ignore-line - - @override - double reciprocityFormula(double t) => t * log10polynomian(t, a, b, c); -} diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart index 812f0e6..96d7d9d 100644 --- a/lib/data/shared_prefs_service.dart +++ b/lib/data/shared_prefs_service.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/theme_type.dart'; @@ -19,7 +18,6 @@ class UserPreferencesService { static const cameraEvCalibrationKey = "cameraEvCalibration"; static const lightSensorEvCalibrationKey = "lightSensorEvCalibration"; static const meteringScreenLayoutKey = "meteringScreenLayout"; - static const filmKey = "film"; static const caffeineKey = "caffeine"; static const hapticsKey = "haptics"; @@ -142,10 +140,4 @@ class UserPreferencesService { bool get dynamicColor => _sharedPreferences.getBool(dynamicColorKey) ?? false; set dynamicColor(bool value) => _sharedPreferences.setBool(dynamicColorKey, value); - - Film get film => Film.values.firstWhere( - (e) => e.name == _sharedPreferences.getString(filmKey), - orElse: () => Film.values.first, - ); - set film(Film value) => _sharedPreferences.setString(filmKey, value.name); } diff --git a/lib/interactors/metering_interactor.dart b/lib/interactors/metering_interactor.dart index 7ea25ac..b4427de 100644 --- a/lib/interactors/metering_interactor.dart +++ b/lib/interactors/metering_interactor.dart @@ -2,7 +2,6 @@ import 'package:app_settings/app_settings.dart'; import 'package:lightmeter/data/caffeine_service.dart'; import 'package:lightmeter/data/haptics_service.dart'; import 'package:lightmeter/data/light_sensor_service.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/volume_action.dart'; import 'package:lightmeter/data/permissions_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; @@ -45,9 +44,6 @@ class MeteringInteractor { NdValue get ndFilter => _userPreferencesService.ndFilter; set ndFilter(NdValue value) => _userPreferencesService.ndFilter = value; - Film get film => _userPreferencesService.film; - set film(Film value) => _userPreferencesService.film = value; - VolumeAction get volumeAction => _userPreferencesService.volumeAction; /// Executes vibration if haptics are enabled in settings diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 3d3ec6b..364deec 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -41,6 +41,9 @@ "meteringScreenFeatureFilmPicker": "Film picker", "meteringScreenFeatureHistogram": "Histogram", "film": "Film", + "filmPush": "Film (push)", + "filmPull": "Film (pull)", + "filmReciprocityHint": "Applies correction for shutter speeds grater than 1 second", "equipment": "Equipment", "equipmentProfileName": "Equipment profile name", "equipmentProfileNameHint": "Praktica MTL5B", @@ -56,6 +59,8 @@ "equipmentProfile": "Equipment profile", "equipmentProfiles": "Equipment profiles", "tapToAdd": "Tap to add", + "filmsInUse": "Films in use", + "filmsInUseDescription": "Select films which you use.", "general": "General", "keepScreenOn": "Keep screen on", "haptics": "Haptics", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 4c6f353..22b0356 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -41,9 +41,11 @@ "meteringScreenFeatureFilmPicker": "Sélecteur de film", "meteringScreenFeatureHistogram": "Histogramme", "film": "Pellicule", + "filmPush": "Pellicule (push)", + "filmPull": "Pellicule (pull)", + "filmReciprocityHint": "La correction s'applique aux vitesses d'obturation supérieures à 1 seconde", "equipment": "Équipement", "equipmentProfileName": "Nom du profil de l'équipement", - "tapToAdd": "Appuie pour ajouter", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "Tout", "apertureValues": "Valeurs Aperture", @@ -56,6 +58,9 @@ "isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.", "equipmentProfile": "Profil de l'équipement", "equipmentProfiles": "Profils de l'équipement", + "tapToAdd": "Appuie pour ajouter", + "filmsInUse": "Films en usage", + "filmsInUseDescription": "Sélectionnez les films que vous utilisez.", "general": "Général", "keepScreenOn": "Garder l'écran allumé", "haptics": "Haptiques", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 7a7c772..9ce0d9b 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -41,6 +41,9 @@ "meteringScreenFeatureFilmPicker": "Выбор пленки", "meteringScreenFeatureHistogram": "Гистограмма", "film": "Пленка", + "filmPush": "Пленка (push)", + "filmPull": "Пленка (pull)", + "filmReciprocityHint": "Применяет коррекцию для выдержек длиннее 1 секунды", "equipment": "Оборудование", "equipmentProfileName": "Название профиля", "equipmentProfileNameHint": "Praktica MTL5B", @@ -56,6 +59,8 @@ "equipmentProfile": "Оборудование", "equipmentProfiles": "Профили оборудования", "tapToAdd": "Нажмите, чтобы добавить", + "filmsInUse": "Используемые пленки", + "filmsInUseDescription": "Выберите пленки, которыми вы пользуетесь.", "general": "Общие", "keepScreenOn": "Запрет блокировки", "haptics": "Вибрация", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 8c4fb07..357ef95 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -31,7 +31,7 @@ "thirdStops": "1/3", "calibration": "校准", "calibrationMessage": "此应用测量读数的准确性完全取决于设备的硬件。因此,请考虑测试此应用并手动设置 EV 校准,以获得准确的测量结果。", - "calibrationMessageCameraOnly": "此应用程序测量读数的准确性完全取决于设备的后置摄像头。因此,请考虑测试此应用并手动设置 EV 校准,以获得准确的测量结果。", + "calibrationMessageCameraOnly": "此应用程序测量读数的准确s性完全取决于设备的后置摄像头。因此,请考虑测试此应用并手动设置 EV 校准,以获得准确的测量结果。", "camera": "摄像头", "lightSensor": "光传感器", "meteringScreenLayout": "布局", @@ -41,6 +41,9 @@ "meteringScreenFeatureFilmPicker": "胶片选择", "meteringScreenFeatureHistogram": "直方图", "film": "胶片", + "filmPush": "胶片 (push)", + "filmPull": "胶片 (pull)", + "filmReciprocityHint": "Applies correction for shutter speeds grater than 1 second", "equipment": "设备", "equipmentProfileName": "设备配置名称", "equipmentProfileNameHint": "Praktica MTL5B", @@ -56,6 +59,8 @@ "equipmentProfile": "设备配置", "equipmentProfiles": "设备配置", "tapToAdd": "點擊添加", + "filmsInUse": "Films in use", + "filmsInUseDescription": "Select films which you use.", "general": "通用", "keepScreenOn": "保持屏幕常亮", "haptics": "震动", diff --git a/lib/screens/metering/bloc_metering.dart b/lib/screens/metering/bloc_metering.dart index 8e4a2f6..cbb0356 100644 --- a/lib/screens/metering/bloc_metering.dart +++ b/lib/screens/metering/bloc_metering.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:bloc_concurrency/bloc_concurrency.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/volume_action.dart'; import 'package:lightmeter/interactors/metering_interactor.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; @@ -29,7 +28,6 @@ class MeteringBloc extends Bloc { ) : super( MeteringDataState( ev100: null, - film: _meteringInteractor.film, iso: _meteringInteractor.iso, nd: _meteringInteractor.ndFilter, isMetering: false, @@ -42,7 +40,6 @@ class MeteringBloc extends Bloc { .listen(onCommunicationState); on(_onEquipmentProfileChanged); - on(_onFilmChanged); on(_onIsoChanged); on(_onNdChanged); on(_onMeasure, transformer: droppable()); @@ -92,12 +89,9 @@ class MeteringBloc extends Bloc { /// Update selected ISO value and discard selected film, if selected equipment profile /// doesn't contain currently selected value IsoValue iso = state.iso; - Film film = state.film; if (!event.equipmentProfileData.isoValues.any((v) => state.iso.value == v.value)) { _meteringInteractor.iso = event.equipmentProfileData.isoValues.first; iso = event.equipmentProfileData.isoValues.first; - _meteringInteractor.film = Film.values.first; - film = Film.values.first; willUpdateMeasurements = true; } @@ -113,7 +107,6 @@ class MeteringBloc extends Bloc { emit( MeteringDataState( ev100: state.ev100, - film: film, iso: iso, nd: nd, isMetering: state.isMetering, @@ -122,46 +115,12 @@ class MeteringBloc extends Bloc { } } - void _onFilmChanged(FilmChangedEvent event, Emitter emit) { - if (state.film.name != event.film.name) { - _meteringInteractor.film = event.film; - - /// Find `IsoValue` with matching value - IsoValue iso = state.iso; - if (state.iso.value != event.film.iso && event.film != const Film.other()) { - iso = IsoValue.values.firstWhere( - (e) => e.value == event.film.iso, - orElse: () => state.iso, - ); - _meteringInteractor.iso = iso; - } - - /// If user selects 'Other' film we preserve currently selected ISO - /// and therefore only discard reciprocity formula - emit( - MeteringDataState( - ev100: state.ev100, - film: event.film, - iso: iso, - nd: state.nd, - isMetering: state.isMetering, - ), - ); - } - } - void _onIsoChanged(IsoChangedEvent event, Emitter emit) { - /// Discard currently selected film even if ISO is the same, - /// because, for example, Fomapan 400 and any Ilford 400 - /// have different reciprocity formulas - _meteringInteractor.film = Film.values.first; - if (state.iso != event.isoValue) { _meteringInteractor.iso = event.isoValue; emit( MeteringDataState( ev100: state.ev100, - film: Film.values.first, iso: event.isoValue, nd: state.nd, isMetering: state.isMetering, @@ -176,7 +135,6 @@ class MeteringBloc extends Bloc { emit( MeteringDataState( ev100: state.ev100, - film: state.film, iso: state.iso, nd: event.ndValue, isMetering: state.isMetering, @@ -190,7 +148,6 @@ class MeteringBloc extends Bloc { _communicationBloc.add(const communication_events.MeasureEvent()); emit( LoadingState( - film: state.film, iso: state.iso, nd: state.nd, ), @@ -209,7 +166,6 @@ class MeteringBloc extends Bloc { emit( MeteringDataState( ev100: event.ev100, - film: state.film, iso: state.iso, nd: state.nd, isMetering: event.isMetering, @@ -221,7 +177,6 @@ class MeteringBloc extends Bloc { emit( MeteringDataState( ev100: null, - film: state.film, iso: state.iso, nd: state.nd, isMetering: event.isMetering, diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart index ecfcb42..1ae0ca9 100644 --- a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart @@ -31,27 +31,7 @@ class _CameraPreviewState extends State { AnimatedSwitcher( duration: Dimens.switchDuration, child: widget.controller != null - ? ValueListenableBuilder( - valueListenable: widget.controller!, - builder: (_, __, ___) => widget.controller!.value.isInitialized - ? Stack( - alignment: Alignment.bottomCenter, - children: [ - CameraView(controller: widget.controller!), - if (UserPreferencesProvider.meteringScreenFeatureOf( - context, - MeteringScreenLayoutFeature.histogram, - )) - Positioned( - left: Dimens.grid8, - right: Dimens.grid8, - bottom: Dimens.grid16, - child: CameraHistogram(controller: widget.controller!), - ), - ], - ) - : const SizedBox.shrink(), - ) + ? _CameraPreviewBuilder(controller: widget.controller!) : CameraViewPlaceholder(error: widget.error), ), ], @@ -60,3 +40,59 @@ class _CameraPreviewState extends State { ); } } + +class _CameraPreviewBuilder extends StatefulWidget { + final CameraController controller; + + const _CameraPreviewBuilder({required this.controller}); + + @override + State<_CameraPreviewBuilder> createState() => _CameraPreviewBuilderState(); +} + +class _CameraPreviewBuilderState extends State<_CameraPreviewBuilder> { + late final ValueNotifier _initializedNotifier = + ValueNotifier(widget.controller.value.isInitialized); + + @override + void initState() { + super.initState(); + widget.controller.addListener(_update); + } + + @override + void dispose() { + widget.controller.removeListener(_update); + _initializedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: _initializedNotifier, + builder: (context, value, child) => value + ? Stack( + alignment: Alignment.bottomCenter, + children: [ + CameraView(controller: widget.controller), + if (UserPreferencesProvider.meteringScreenFeatureOf( + context, + MeteringScreenLayoutFeature.histogram, + )) + Positioned( + left: Dimens.grid8, + right: Dimens.grid8, + bottom: Dimens.grid16, + child: CameraHistogram(controller: widget.controller), + ), + ], + ) + : const SizedBox.shrink(), + ); + } + + void _update() { + _initializedNotifier.value = widget.controller.value.isInitialized; + } +} diff --git a/lib/screens/metering/components/camera_container/provider_container_camera.dart b/lib/screens/metering/components/camera_container/provider_container_camera.dart index 0e27700..1d6d8c0 100644 --- a/lib/screens/metering/components/camera_container/provider_container_camera.dart +++ b/lib/screens/metering/components/camera_container/provider_container_camera.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/event_container_camera.dart'; @@ -12,10 +11,8 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class CameraContainerProvider extends StatelessWidget { final ExposurePair? fastest; final ExposurePair? slowest; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; final List exposurePairs; @@ -23,10 +20,8 @@ class CameraContainerProvider extends StatelessWidget { const CameraContainerProvider({ required this.fastest, required this.slowest, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, required this.exposurePairs, @@ -44,10 +39,8 @@ class CameraContainerProvider extends StatelessWidget { child: CameraContainer( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, exposurePairs: exposurePairs, diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index 0514d92..944aa34 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -3,7 +3,6 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/platform_config.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; @@ -23,10 +22,8 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class CameraContainer extends StatelessWidget { final ExposurePair? fastest; final ExposurePair? slowest; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; final List exposurePairs; @@ -34,10 +31,8 @@ class CameraContainer extends StatelessWidget { const CameraContainer({ required this.fastest, required this.slowest, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, required this.exposurePairs, @@ -60,10 +55,8 @@ class CameraContainer extends StatelessWidget { readingsContainer: ReadingsContainer( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, ), diff --git a/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart b/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart index aa27504..1d7f822 100644 --- a/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart +++ b/lib/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart'; import 'package:lightmeter/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart'; @@ -11,10 +10,8 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class LightSensorContainerProvider extends StatelessWidget { final ExposurePair? fastest; final ExposurePair? slowest; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; final List exposurePairs; @@ -22,10 +19,8 @@ class LightSensorContainerProvider extends StatelessWidget { const LightSensorContainerProvider({ required this.fastest, required this.slowest, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, required this.exposurePairs, @@ -43,10 +38,8 @@ class LightSensorContainerProvider extends StatelessWidget { child: LightSensorContainer( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, exposurePairs: exposurePairs, diff --git a/lib/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart b/lib/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart index 4380f02..2151ee0 100644 --- a/lib/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart +++ b/lib/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart'; import 'package:lightmeter/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart'; @@ -10,10 +9,8 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class LightSensorContainer extends StatelessWidget { final ExposurePair? fastest; final ExposurePair? slowest; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; final List exposurePairs; @@ -21,10 +18,8 @@ class LightSensorContainer extends StatelessWidget { const LightSensorContainer({ required this.fastest, required this.slowest, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, required this.exposurePairs, @@ -39,10 +34,8 @@ class LightSensorContainer extends StatelessWidget { readingsContainer: ReadingsContainer( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, ), diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart index 3f33d03..4051c5e 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart @@ -5,6 +5,7 @@ import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart'; import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; class ExposurePairsList extends StatelessWidget { final List exposurePairs; @@ -47,7 +48,8 @@ class ExposurePairsList extends StatelessWidget { child: Align( alignment: Alignment.centerLeft, child: ExposurePairsListItem( - exposurePairs[index].shutterSpeed, + Films.selectedOf(context) + .reciprocityFailure(exposurePairs[index].shutterSpeed), tickOnTheLeft: true, ), ), diff --git a/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart b/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart new file mode 100644 index 0000000..f47cd53 --- /dev/null +++ b/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class EquipmentProfilePicker extends StatelessWidget { + const EquipmentProfilePicker(); + + @override + Widget build(BuildContext context) { + return AnimatedDialogPicker( + icon: Icons.camera, + title: S.of(context).equipmentProfile, + selectedValue: EquipmentProfiles.selectedOf(context), + values: EquipmentProfiles.of(context), + itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name), + onChanged: EquipmentProfileProvider.of(context).setProfile, + closedChild: ReadingValueContainer.singleValue( + value: ReadingValue( + label: S.of(context).equipmentProfile, + value: EquipmentProfiles.selectedOf(context).id.isEmpty + ? S.of(context).none + : EquipmentProfiles.selectedOf(context).name, + ), + ), + ); + } +} diff --git a/lib/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart b/lib/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart new file mode 100644 index 0000000..54c786c --- /dev/null +++ b/lib/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/data/models/exposure_pair.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; + +class ExtremeExposurePairsContainer extends StatelessWidget { + final ExposurePair? fastest; + final ExposurePair? slowest; + + const ExtremeExposurePairsContainer({ + required this.fastest, + required this.slowest, + super.key, + }); + + @override + Widget build(BuildContext context) { + return ReadingValueContainer( + values: [ + ReadingValue( + label: S.of(context).fastestExposurePair, + value: _exposurePairToString(context, fastest), + ), + ReadingValue( + label: S.of(context).slowestExposurePair, + value: _exposurePairToString(context, slowest), + ), + ], + ); + } + + String _exposurePairToString(BuildContext context, ExposurePair? pair) { + if (pair == null) { + return '-'; + } + + return '${pair.aperture} - ${Films.selectedOf(context).reciprocityFailure(pair.shutterSpeed)}'; + } +} diff --git a/lib/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart b/lib/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart new file mode 100644 index 0000000..ae1e6fe --- /dev/null +++ b/lib/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class FilmPicker extends StatelessWidget { + final IsoValue selectedIso; + + const FilmPicker({required this.selectedIso}); + + @override + Widget build(BuildContext context) { + return AnimatedDialogPicker( + icon: Icons.camera_roll, + title: S.of(context).film, + subtitle: S.of(context).filmReciprocityHint, + selectedValue: Films.selectedOf(context), + values: Films.inUseOf(context), + itemTitleBuilder: (_, value) => Text(value.name.isEmpty ? S.of(context).none : value.name), + onChanged: FilmsProvider.of(context).setFilm, + closedChild: ReadingValueContainer.singleValue( + value: ReadingValue( + label: _label(context), + value: Films.selectedOf(context).name.isEmpty + ? S.of(context).none + : Films.selectedOf(context).name, + ), + ), + ); + } + + String _label(BuildContext context) { + if (Films.selectedOf(context) == const Film.other() || + Films.selectedOf(context).iso == selectedIso.value) { + return S.of(context).film; + } + + final evDiff = IsoValue( + Films.selectedOf(context).iso, + StopType.full, + ).difference(selectedIso); + + if (evDiff > 0) { + return S.of(context).filmPush; + } else if (evDiff < 0) { + return S.of(context).filmPull; + } else { + return S.of(context).film; + } + } +} diff --git a/lib/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart b/lib/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart new file mode 100644 index 0000000..a85b30c --- /dev/null +++ b/lib/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class IsoValuePicker extends StatelessWidget { + final List values; + final IsoValue selectedValue; + final ValueChanged onChanged; + + const IsoValuePicker({ + required this.selectedValue, + required this.values, + required this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return AnimatedDialogPicker( + icon: Icons.iso, + title: S.of(context).iso, + subtitle: S.of(context).filmSpeed, + selectedValue: selectedValue, + values: values, + itemTitleBuilder: (_, value) => Text(value.value.toString()), + // using ascending order, because increase in film speed rises EV + itemTrailingBuilder: (selected, value) => value.value != selected.value + ? Text(S.of(context).evValue(selected.toStringDifference(value))) + : null, + onChanged: onChanged, + closedChild: ReadingValueContainer.singleValue( + value: ReadingValue( + label: S.of(context).iso, + value: selectedValue.value.toString(), + ), + ), + ); + } +} diff --git a/lib/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart b/lib/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart new file mode 100644 index 0000000..eda016c --- /dev/null +++ b/lib/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class NdValuePicker extends StatelessWidget { + final List values; + final NdValue selectedValue; + final ValueChanged onChanged; + + const NdValuePicker({ + required this.selectedValue, + required this.values, + required this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return AnimatedDialogPicker( + icon: Icons.filter_b_and_w, + title: S.of(context).nd, + subtitle: S.of(context).ndFilterFactor, + selectedValue: selectedValue, + values: values, + itemTitleBuilder: (_, value) => Text( + value.value == 0 ? S.of(context).none : value.value.toString(), + ), + // using descending order, because ND filter darkens image & lowers EV + itemTrailingBuilder: (selected, value) => value.value != selected.value + ? Text(S.of(context).evValue(value.toStringDifference(selected))) + : null, + onChanged: onChanged, + closedChild: ReadingValueContainer.singleValue( + value: ReadingValue( + label: S.of(context).nd, + value: selectedValue.value.toString(), + ), + ), + ); + } +} diff --git a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart similarity index 100% rename from lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart rename to lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart diff --git a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart similarity index 100% rename from lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart rename to lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart diff --git a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart similarity index 89% rename from lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart rename to lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart index d123d99..eeeec52 100644 --- a/lib/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart +++ b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/widget_picker_dialog_animated.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; - -import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart'; -import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart'; // Has to be stateful, so that [GlobalKey] is not recreated. // Otherwise use will no be able to close the dialog after EV value has changed. diff --git a/lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart b/lib/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart similarity index 100% rename from lib/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart rename to lib/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart diff --git a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart index c9f6f54..f10546d 100644 --- a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart +++ b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart @@ -1,32 +1,29 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart'; -import 'package:lightmeter/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart'; import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class ReadingsContainer extends StatelessWidget { final ExposurePair? fastest; final ExposurePair? slowest; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; const ReadingsContainer({ required this.fastest, required this.slowest, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, super.key, @@ -41,24 +38,16 @@ class ReadingsContainer extends StatelessWidget { context, MeteringScreenLayoutFeature.equipmentProfiles, )) ...[ - const _EquipmentProfilePicker(), + const EquipmentProfilePicker(), const _InnerPadding(), ], if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) ...[ - ReadingValueContainer( - values: [ - ReadingValue( - label: S.of(context).fastestExposurePair, - value: fastest != null ? fastest!.toString() : '-', - ), - ReadingValue( - label: S.of(context).slowestExposurePair, - value: fastest != null ? slowest!.toString() : '-', - ), - ], + ExtremeExposurePairsContainer( + fastest: fastest, + slowest: slowest, ), const _InnerPadding(), ], @@ -66,17 +55,13 @@ class ReadingsContainer extends StatelessWidget { context, MeteringScreenLayoutFeature.filmPicker, )) ...[ - _FilmPicker( - values: Film.values, - selectedValue: film, - onChanged: onFilmChanged, - ), + FilmPicker(selectedIso: iso), const _InnerPadding(), ], Row( children: [ Expanded( - child: _IsoValuePicker( + child: IsoValuePicker( selectedValue: iso, values: EquipmentProfiles.selectedOf(context).isoValues, onChanged: onIsoChanged, @@ -84,7 +69,7 @@ class ReadingsContainer extends StatelessWidget { ), const _InnerPadding(), Expanded( - child: _NdValuePicker( + child: NdValuePicker( selectedValue: nd, values: EquipmentProfiles.selectedOf(context).ndValues, onChanged: onNdChanged, @@ -100,129 +85,3 @@ class ReadingsContainer extends StatelessWidget { class _InnerPadding extends SizedBox { const _InnerPadding() : super(height: Dimens.grid8, width: Dimens.grid8); } - -class _EquipmentProfilePicker extends StatelessWidget { - const _EquipmentProfilePicker(); - - @override - Widget build(BuildContext context) { - return AnimatedDialogPicker( - icon: Icons.camera, - title: S.of(context).equipmentProfile, - selectedValue: EquipmentProfiles.selectedOf(context), - values: EquipmentProfiles.of(context), - itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name), - onChanged: EquipmentProfileProvider.of(context).setProfile, - closedChild: ReadingValueContainer.singleValue( - value: ReadingValue( - label: S.of(context).equipmentProfile, - value: EquipmentProfiles.selectedOf(context).id.isEmpty - ? S.of(context).none - : EquipmentProfiles.selectedOf(context).name, - ), - ), - ); - } -} - -class _FilmPicker extends StatelessWidget { - final List values; - final Film selectedValue; - final ValueChanged onChanged; - - const _FilmPicker({ - required this.values, - required this.selectedValue, - required this.onChanged, - }); - - @override - Widget build(BuildContext context) { - return AnimatedDialogPicker( - icon: Icons.camera_roll, - title: S.of(context).film, - selectedValue: selectedValue, - values: values, - itemTitleBuilder: (_, value) => Text(value.name.isEmpty ? S.of(context).none : value.name), - onChanged: onChanged, - closedChild: ReadingValueContainer.singleValue( - value: ReadingValue( - label: S.of(context).film, - value: selectedValue.name.isEmpty ? S.of(context).none : selectedValue.name, - ), - ), - ); - } -} - -class _IsoValuePicker extends StatelessWidget { - final List values; - final IsoValue selectedValue; - final ValueChanged onChanged; - - const _IsoValuePicker({ - required this.selectedValue, - required this.values, - required this.onChanged, - }); - - @override - Widget build(BuildContext context) { - return AnimatedDialogPicker( - icon: Icons.iso, - title: S.of(context).iso, - subtitle: S.of(context).filmSpeed, - selectedValue: selectedValue, - values: values, - itemTitleBuilder: (_, value) => Text(value.value.toString()), - // using ascending order, because increase in film speed rises EV - itemTrailingBuilder: (selected, value) => value.value != selected.value - ? Text(S.of(context).evValue(selected.toStringDifference(value))) - : null, - onChanged: onChanged, - closedChild: ReadingValueContainer.singleValue( - value: ReadingValue( - label: S.of(context).iso, - value: selectedValue.value.toString(), - ), - ), - ); - } -} - -class _NdValuePicker extends StatelessWidget { - final List values; - final NdValue selectedValue; - final ValueChanged onChanged; - - const _NdValuePicker({ - required this.selectedValue, - required this.values, - required this.onChanged, - }); - - @override - Widget build(BuildContext context) { - return AnimatedDialogPicker( - icon: Icons.filter_b_and_w, - title: S.of(context).nd, - subtitle: S.of(context).ndFilterFactor, - selectedValue: selectedValue, - values: values, - itemTitleBuilder: (_, value) => Text( - value.value == 0 ? S.of(context).none : value.value.toString(), - ), - // using descending order, because ND filter darkens image & lowers EV - itemTrailingBuilder: (selected, value) => value.value != selected.value - ? Text(S.of(context).evValue(value.toStringDifference(selected))) - : null, - onChanged: onChanged, - closedChild: ReadingValueContainer.singleValue( - value: ReadingValue( - label: S.of(context).nd, - value: selectedValue.value.toString(), - ), - ), - ); - } -} diff --git a/lib/screens/metering/event_metering.dart b/lib/screens/metering/event_metering.dart index bf3a22d..0a39844 100644 --- a/lib/screens/metering/event_metering.dart +++ b/lib/screens/metering/event_metering.dart @@ -1,4 +1,3 @@ -import 'package:lightmeter/data/models/film.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; sealed class MeteringEvent { @@ -11,12 +10,6 @@ class EquipmentProfileChangedEvent extends MeteringEvent { const EquipmentProfileChangedEvent(this.equipmentProfileData); } -class FilmChangedEvent extends MeteringEvent { - final Film film; - - const FilmChangedEvent(this.film); -} - class IsoChangedEvent extends MeteringEvent { final IsoValue isoValue; diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 93d515e..f1d11fb 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; @@ -33,11 +32,8 @@ class MeteringScreen extends StatelessWidget { child: BlocBuilder( builder: (_, state) => MeteringContainerBuidler( ev: state is MeteringDataState ? state.ev : null, - film: state.film, iso: state.iso, nd: state.nd, - onFilmChanged: (value) => - context.read().add(FilmChangedEvent(value)), onIsoChanged: (value) => context.read().add(IsoChangedEvent(value)), onNdChanged: (value) => context.read().add(NdChangedEvent(value)), ), @@ -81,7 +77,7 @@ class _InheritedListeners extends StatelessWidget { feature: MeteringScreenLayoutFeature.filmPicker, onDidChangeDependencies: (value) { if (!value) { - context.read().add(const FilmChangedEvent(Film.other())); + FilmsProvider.of(context).setFilm(const Film.other()); } }, child: child, @@ -92,19 +88,15 @@ class _InheritedListeners extends StatelessWidget { class MeteringContainerBuidler extends StatelessWidget { final double? ev; - final Film film; final IsoValue iso; final NdValue nd; - final ValueChanged onFilmChanged; final ValueChanged onIsoChanged; final ValueChanged onNdChanged; const MeteringContainerBuidler({ required this.ev, - required this.film, required this.iso, required this.nd, - required this.onFilmChanged, required this.onIsoChanged, required this.onNdChanged, }); @@ -116,7 +108,6 @@ class MeteringContainerBuidler extends StatelessWidget { ev!, UserPreferencesProvider.stopTypeOf(context), EquipmentProfiles.selectedOf(context), - film, ) : []; final fastest = exposurePairs.isNotEmpty ? exposurePairs.first : null; @@ -126,10 +117,8 @@ class MeteringContainerBuidler extends StatelessWidget { ? CameraContainerProvider( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, exposurePairs: exposurePairs, @@ -137,10 +126,8 @@ class MeteringContainerBuidler extends StatelessWidget { : LightSensorContainerProvider( fastest: fastest, slowest: slowest, - film: film, iso: iso, nd: nd, - onFilmChanged: onFilmChanged, onIsoChanged: onIsoChanged, onNdChanged: onNdChanged, exposurePairs: exposurePairs, @@ -152,7 +139,6 @@ class MeteringContainerBuidler extends StatelessWidget { double ev, StopType stopType, EquipmentProfile equipmentProfile, - Film film, ) { if (ev.isNaN || ev.isInfinite) { return List.empty(); @@ -195,7 +181,7 @@ class MeteringContainerBuidler extends StatelessWidget { itemsCount, (index) => ExposurePair( apertureValues[index + apertureOffset], - film.reciprocityFailure(shutterSpeedValues[index + shutterSpeedOffset]), + shutterSpeedValues[index + shutterSpeedOffset], ), growable: false, ); diff --git a/lib/screens/metering/state_metering.dart b/lib/screens/metering/state_metering.dart index 909895d..74dc792 100644 --- a/lib/screens/metering/state_metering.dart +++ b/lib/screens/metering/state_metering.dart @@ -1,18 +1,15 @@ import 'package:flutter/material.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; @immutable abstract class MeteringState { final double? ev100; - final Film film; final IsoValue iso; final NdValue nd; final bool isMetering; const MeteringState({ this.ev100, - required this.film, required this.iso, required this.nd, required this.isMetering, @@ -21,7 +18,6 @@ abstract class MeteringState { class LoadingState extends MeteringState { const LoadingState({ - required super.film, required super.iso, required super.nd, }) : super(isMetering: true); @@ -30,7 +26,6 @@ class LoadingState extends MeteringState { class MeteringDataState extends MeteringState { const MeteringDataState({ required super.ev100, - required super.film, required super.iso, required super.nd, required super.isMetering, diff --git a/lib/screens/metering/utils/equipment_profile_listener.dart b/lib/screens/metering/utils/equipment_profile_listener.dart deleted file mode 100644 index 68d03dc..0000000 --- a/lib/screens/metering/utils/equipment_profile_listener.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; - -class EquipmentProfileListener extends StatefulWidget { - final ValueChanged onDidChangeDependencies; - final Widget child; - - const EquipmentProfileListener({ - required this.onDidChangeDependencies, - required this.child, - super.key, - }); - - @override - State createState() => _EquipmentProfileListenerState(); -} - -class _EquipmentProfileListenerState extends State { - @override - void didChangeDependencies() { - super.didChangeDependencies(); - widget.onDidChangeDependencies(EquipmentProfiles.selectedOf(context)); - } - - @override - Widget build(BuildContext context) { - return widget.child; - } -} diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart similarity index 90% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart rename to lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart index 695e4e3..482c370 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart'; +import 'package:lightmeter/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart'; +import 'package:lightmeter/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentListTiles extends StatelessWidget { diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart similarity index 94% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart rename to lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index c11cd2c..244ddce 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -3,8 +3,8 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileContainer extends StatefulWidget { diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart similarity index 100% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart rename to lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart similarity index 92% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart rename to lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index 5307145..a5b0eca 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart new file mode 100644 index 0000000..0cb5631 --- /dev/null +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class EquipmentProfilesListTile extends StatelessWidget { + const EquipmentProfilesListTile({super.key}); + + @override + Widget build(BuildContext context) { + return IAPListTile( + leading: const Icon(Icons.camera), + title: Text(S.of(context).equipmentProfiles), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()), + ); + }, + ); + } +} diff --git a/lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart b/lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart new file mode 100644 index 0000000..c343e2b --- /dev/null +++ b/lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart'; +import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class FilmsListTile extends StatelessWidget { + const FilmsListTile({super.key}); + + @override + Widget build(BuildContext context) { + return IAPListTile( + leading: const Icon(Icons.camera_roll), + title: Text(S.of(context).filmsInUse), + onTap: () { + showDialog>( + context: context, + builder: (_) => DialogFilter( + icon: const Icon(Icons.camera_roll), + title: S.of(context).filmsInUse, + description: S.of(context).filmsInUseDescription, + values: Films.of(context).sublist(1), + selectedValues: Films.inUseOf(context), + titleAdapter: (_, value) => value.name, + ), + ).then((values) { + if (values != null) { + FilmsProvider.of(context).saveFilms(values); + } + }); + }, + ); + } +} diff --git a/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart b/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart new file mode 100644 index 0000000..ba3b975 --- /dev/null +++ b/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart'; +import 'package:lightmeter/screens/settings/components/equipment/components/films/widget_list_tile_films.dart'; +import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; + +class EquipmentSettingsSection extends StatelessWidget { + const EquipmentSettingsSection({super.key}); + + @override + Widget build(BuildContext context) { + return SettingsSection( + title: S.of(context).equipment, + children: const [ + EquipmentProfilesListTile(), + FilmsListTile(), + ], + ); + } +} diff --git a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart index 663c634..eeaaf4c 100644 --- a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart +++ b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/generated/l10n.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/widget_dialog_picker.dart'; class LanguageListTile extends StatelessWidget { const LanguageListTile({super.key}); diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart deleted file mode 100644 index 774e215..0000000 --- a/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:developer'; - -import 'package:flutter/material.dart'; -import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; -import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; - -class EquipmentProfilesListTile extends StatelessWidget { - const EquipmentProfilesListTile({super.key}); - - @override - Widget build(BuildContext context) { - final paidStatus = IAPProducts.productOf(context, IAPProductType.paidFeatures)?.status ?? - IAPProductStatus.pending; - log(paidStatus.toString()); - return ListTile( - leading: const Icon(Icons.camera), - title: Text(S.of(context).equipmentProfiles), - onTap: switch (paidStatus) { - IAPProductStatus.purchased => () { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()), - ); - }, - IAPProductStatus.pending => null, - _ => () { - IAPProductsProvider.of(context).buy(IAPProductType.paidFeatures); - }, - }, - trailing: switch (paidStatus) { - IAPProductStatus.purchasable => const Icon(Icons.lock), - IAPProductStatus.pending => const SizedBox( - height: Dimens.grid24, - width: Dimens.grid24, - child: CircularProgressIndicator(), - ), - _ => null, - }, - ); - } -} diff --git a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart index 1bcf6bc..e8b99d1 100644 --- a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart +++ b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.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/widget_dialog_picker.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class StopTypeListTile extends StatelessWidget { diff --git a/lib/screens/settings/components/metering/widget_settings_section_metering.dart b/lib/screens/settings/components/metering/widget_settings_section_metering.dart index 9f86709..c5b9e1d 100644 --- a/lib/screens/settings/components/metering/widget_settings_section_metering.dart +++ b/lib/screens/settings/components/metering/widget_settings_section_metering.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart'; -import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart'; import 'package:lightmeter/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart'; import 'package:lightmeter/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart'; import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; @@ -17,7 +16,6 @@ class MeteringSettingsSection extends StatelessWidget { StopTypeListTile(), CalibrationListTile(), MeteringScreenLayoutListTile(), - EquipmentProfilesListTile(), ], ); } diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart similarity index 92% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart rename to lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart index d91752e..8bafcae 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart +++ b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; -class DialogFilter extends StatefulWidget { +class DialogFilter extends StatefulWidget { final Icon icon; final String title; final String description; @@ -25,10 +24,10 @@ class DialogFilter extends StatefulWidget { State> createState() => _DialogFilterState(); } -class _DialogFilterState extends State> { +class _DialogFilterState extends State> { late final List checkboxValues = List.generate( widget.values.length, - (index) => widget.selectedValues.any((element) => element.value == widget.values[index].value), + (index) => widget.selectedValues.any((element) => element == widget.values[index]), growable: false, ); diff --git a/lib/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart b/lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart similarity index 100% rename from lib/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart rename to lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart b/lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart similarity index 100% rename from lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart rename to lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart diff --git a/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart b/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart new file mode 100644 index 0000000..8c79f37 --- /dev/null +++ b/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; + +/// Depends on the product status and replaces [onTap] with purchase callback +/// if the product is purchasable. +class IAPListTile extends StatelessWidget { + final IAPProductType product; + final Icon leading; + final Text title; + final VoidCallback onTap; + + const IAPListTile({ + this.product = IAPProductType.paidFeatures, + required this.leading, + required this.title, + required this.onTap, + super.key, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: leading, + title: title, + onTap: switch (IAPProducts.productOf(context, product)?.status) { + IAPProductStatus.purchasable => () => IAPProductsProvider.of(context).buy(product), + IAPProductStatus.pending => null, + IAPProductStatus.purchased => onTap, + null => null, + }, + ); + } +} diff --git a/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart b/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart index be62847..9f88d7d 100644 --- a/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart +++ b/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart @@ -4,10 +4,12 @@ import 'package:lightmeter/res/dimens.dart'; class SettingsSection extends StatelessWidget { final String title; final List children; + final bool enabled; const SettingsSection({ required this.title, required this.children, + this.enabled = true, super.key, }); @@ -23,22 +25,25 @@ class SettingsSection extends StatelessWidget { child: Card( child: Padding( padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), - child: Text( - title, - style: Theme.of(context) - .textTheme - .labelLarge - ?.copyWith(color: Theme.of(context).colorScheme.onSurface), + child: Opacity( + opacity: enabled ? Dimens.enabledOpacity : Dimens.disabledOpacity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + child: Text( + title, + style: Theme.of(context) + .textTheme + .labelLarge + ?.copyWith(color: Theme.of(context).colorScheme.onSurface), + ), ), - ), - ...children, - ], + ...children, + ], + ), ), ), ), diff --git a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart index 8a95161..cfcd694 100644 --- a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart +++ b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/generated/l10n.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/widget_dialog_picker.dart'; class ThemeTypeListTile extends StatelessWidget { const ThemeTypeListTile({super.key}); diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 38256e8..7d057cf 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/about/widget_settings_section_about.dart'; +import 'package:lightmeter/screens/settings/components/equipment/widget_settings_section_equipment.dart'; import 'package:lightmeter/screens/settings/components/general/widget_settings_section_general.dart'; import 'package:lightmeter/screens/settings/components/metering/widget_settings_section_metering.dart'; import 'package:lightmeter/screens/settings/components/theme/widget_settings_section_theme.dart'; @@ -43,6 +44,7 @@ class _SettingsScreenState extends State { delegate: SliverChildListDelegate( [ const MeteringSettingsSection(), + const EquipmentSettingsSection(), const GeneralSettingsSection(), const ThemeSettingsSection(), const AboutSettingsSection(), diff --git a/m3_lightmeter.code-workspace b/m3_lightmeter.code-workspace new file mode 100644 index 0000000..35520eb --- /dev/null +++ b/m3_lightmeter.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "iap" + }, + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/test/data/models/film_test.dart b/test/data/models/film_test.dart deleted file mode 100644 index 2feb690..0000000 --- a/test/data/models/film_test.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:lightmeter/data/models/film.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; -import 'package:test/test.dart'; - -void main() { - test('iso', () { - expect(const Film.other().iso, 0); - expect(const FomapanFilm.creative100().iso, 100); - expect(const FomapanFilm.creative200().iso, 200); - expect(const FomapanFilm.action400().iso, 400); - expect(const IlfordFilm.ortho().iso, 80); - expect(const IlfordFilm.delta100().iso, 100); - expect(const IlfordFilm.delta400().iso, 400); - expect(const IlfordFilm.delta3200().iso, 3200); - expect(const IlfordFilm.fp4().iso, 125); - expect(const IlfordFilm.hp5().iso, 400); - expect(const IlfordFilm.panf().iso, 50); - expect(const IlfordFilm.sfx200().iso, 200); - expect(const IlfordFilm.xp2super().iso, 400); - expect(const IlfordFilm.pan100().iso, 100); - expect(const IlfordFilm.pan400().iso, 400); - expect(const KodakFilm.tmax100().iso, 100); - expect(const KodakFilm.tmax400().iso, 400); - expect(const KodakFilm.tmax3200().iso, 3200); - expect(const KodakFilm.trix320().iso, 320); - expect(const KodakFilm.trix400().iso, 400); - }); - - test('toString()', () { - expect(const Film.other().toString(), ""); - expect(const FomapanFilm.creative100().toString(), "Fomapan CREATIVE 100"); - expect(const FomapanFilm.creative200().toString(), "Fomapan CREATIVE 200"); - expect(const FomapanFilm.action400().toString(), "Fomapan ACTION 400"); - expect(const IlfordFilm.ortho().toString(), "Ilford ORTHO+"); - expect(const IlfordFilm.delta100().toString(), "Ilford DELTA 100"); - expect(const IlfordFilm.delta400().toString(), "Ilford DELTA 400"); - expect(const IlfordFilm.delta3200().toString(), "Ilford DELTA 3200"); - expect(const IlfordFilm.fp4().toString(), "Ilford FP4+"); - expect(const IlfordFilm.hp5().toString(), "Ilford HP5+"); - expect(const IlfordFilm.panf().toString(), "Ilford Pan F+"); - expect(const IlfordFilm.sfx200().toString(), "Ilford SFX 200"); - expect(const IlfordFilm.xp2super().toString(), "Ilford XP2 SUPER"); - expect(const IlfordFilm.pan100().toString(), "Kentemere 100"); - expect(const IlfordFilm.pan400().toString(), "Kentemere 400"); - expect(const KodakFilm.tmax100().toString(), "Kodak T-MAX 100"); - expect(const KodakFilm.tmax400().toString(), "Kodak T-MAX 400"); - expect(const KodakFilm.tmax3200().toString(), "Kodak T-MAX 3200"); - expect(const KodakFilm.trix320().toString(), "Kodak TRI-X 320"); - expect(const KodakFilm.trix400().toString(), "Kodak TRI-X 400"); - }); - - group( - 'reciprocityFailure', - () { - const inputSpeeds = [ - ShutterSpeedValue(1000, true, StopType.full), - ShutterSpeedValue(1, false, StopType.full), - ShutterSpeedValue(16, false, StopType.full) - ]; - test('No change `Film.other()`', () { - expect( - const Film.other().reciprocityFailure(inputSpeeds[0]), - const ShutterSpeedValue(1000, true, StopType.full), - ); - expect( - const Film.other().reciprocityFailure(inputSpeeds[1]), - const ShutterSpeedValue(1, false, StopType.full), - ); - expect( - const Film.other().reciprocityFailure(inputSpeeds[2]), - const ShutterSpeedValue(16, false, StopType.full), - ); - }); - - test('pow `IlfordFilm.delta100()`', () { - expect( - const IlfordFilm.delta100().reciprocityFailure(inputSpeeds[0]), - const ShutterSpeedValue(1000, true, StopType.full), - ); - expect( - const IlfordFilm.delta100().reciprocityFailure(inputSpeeds[1]), - const ShutterSpeedValue(1, false, StopType.full), - ); - expect( - const IlfordFilm.delta100().reciprocityFailure(inputSpeeds[2]), - const ShutterSpeedValue(32.899642452994128, false, StopType.full), - ); - }); - - test('log10polynomian `FomapanFilm.creative100()`', () { - expect( - const FomapanFilm.creative100().reciprocityFailure(inputSpeeds[0]), - const ShutterSpeedValue(1000, true, StopType.full), - ); - expect( - const FomapanFilm.creative100().reciprocityFailure(inputSpeeds[1]), - const ShutterSpeedValue(2, false, StopType.full), - ); - expect( - const FomapanFilm.creative100().reciprocityFailure(inputSpeeds[2]), - const ShutterSpeedValue(151.52807753457483, false, StopType.full), - ); - }); - - test('log10polynomian `Kodak.tmax400()`', () { - expect( - const KodakFilm.tmax400().reciprocityFailure(inputSpeeds[0]), - const ShutterSpeedValue(1000, true, StopType.full), - ); - expect( - const KodakFilm.tmax400().reciprocityFailure(inputSpeeds[1]), - const ShutterSpeedValue(1.3333333333333333, false, StopType.full), - ); - expect( - const KodakFilm.tmax400().reciprocityFailure(inputSpeeds[2]), - const ShutterSpeedValue(27.166026086819844, false, StopType.full), - ); - }); - }, - ); -} diff --git a/test/data/shared_prefs_service_test.dart b/test/data/shared_prefs_service_test.dart index 2a63fe5..0896626 100644 --- a/test/data/shared_prefs_service_test.dart +++ b/test/data/shared_prefs_service_test.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/theme_type.dart'; @@ -392,26 +391,4 @@ void main() { .called(1); }); }); - - group('film', () { - test('get default', () { - when(() => sharedPreferences.getString(UserPreferencesService.filmKey)).thenReturn(null); - expect(service.film, Film.values.first); - }); - - test('get', () { - when(() => sharedPreferences.getString(UserPreferencesService.filmKey)) - .thenReturn('Fomapan ACTION 400'); - expect(service.film, const FomapanFilm.action400()); - }); - - test('set', () { - when(() => sharedPreferences.setString(UserPreferencesService.filmKey, 'Fomapan ACTION 400')) - .thenAnswer((_) => Future.value(true)); - service.film = const FomapanFilm.action400(); - verify( - () => sharedPreferences.setString(UserPreferencesService.filmKey, 'Fomapan ACTION 400'), - ).called(1); - }); - }); } diff --git a/test/interactors/metering_interactor_test.dart b/test/interactors/metering_interactor_test.dart index bd6a169..1f0b05a 100644 --- a/test/interactors/metering_interactor_test.dart +++ b/test/interactors/metering_interactor_test.dart @@ -2,7 +2,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:lightmeter/data/caffeine_service.dart'; import 'package:lightmeter/data/haptics_service.dart'; import 'package:lightmeter/data/light_sensor_service.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/volume_action.dart'; import 'package:lightmeter/data/permissions_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; @@ -124,19 +123,6 @@ void main() { interactor.ndFilter = NdValue.values.first; verify(() => mockUserPreferencesService.ndFilter = NdValue.values.first).called(1); }); - - test('film - get', () async { - when(() => mockUserPreferencesService.film).thenReturn(Film.values.first); - expect(interactor.film, Film.values.first); - verify(() => mockUserPreferencesService.film).called(1); - }); - - test('film - set', () async { - when(() => mockUserPreferencesService.film = Film.values.first) - .thenReturn(Film.values.first); - interactor.film = Film.values.first; - verify(() => mockUserPreferencesService.film = Film.values.first).called(1); - }); }, ); diff --git a/test/screens/metering/bloc_metering_test.dart b/test/screens/metering/bloc_metering_test.dart index 45b9291..fbffbbc 100644 --- a/test/screens/metering/bloc_metering_test.dart +++ b/test/screens/metering/bloc_metering_test.dart @@ -1,5 +1,4 @@ import 'package:bloc_test/bloc_test.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/volume_action.dart'; import 'package:lightmeter/interactors/metering_interactor.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; @@ -34,7 +33,6 @@ void main() { meteringInteractor = _MockMeteringInteractor(); when(() => meteringInteractor.iso).thenReturn(iso100); when(() => meteringInteractor.ndFilter).thenReturn(NdValue.values.first); - when(() => meteringInteractor.film).thenReturn(Film.values.first); when(meteringInteractor.quickVibration).thenAnswer((_) async {}); when(meteringInteractor.responseVibration).thenAnswer((_) async {}); when(meteringInteractor.errorVibration).thenAnswer((_) async {}); @@ -157,7 +155,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -166,14 +163,12 @@ void main() { bloc.add(const IsoChangedEvent(IsoValue(200, StopType.full))); }, verify: (_) { - verify(() => meteringInteractor.film = Film.values.first).called(1); verify(() => meteringInteractor.iso = const IsoValue(200, StopType.full)).called(1); }, expect: () => [ isA() .having((state) => state.ev100, 'ev100', 1.0) .having((state) => state.ev, 'ev', 2.0) - .having((state) => state.film, 'film', Film.values.first) .having((state) => state.iso, 'iso', const IsoValue(200, StopType.full)) .having((state) => state.nd, 'nd', NdValue.values.first) .having((state) => state.isMetering, 'isMetering', false), @@ -185,7 +180,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: null, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -194,14 +188,12 @@ void main() { bloc.add(const IsoChangedEvent(IsoValue(200, StopType.full))); }, verify: (_) { - verify(() => meteringInteractor.film = Film.values.first).called(1); verify(() => meteringInteractor.iso = const IsoValue(200, StopType.full)).called(1); }, expect: () => [ isA() .having((state) => state.ev100, 'ev100', null) .having((state) => state.ev, 'ev', null) - .having((state) => state.film, 'film', Film.values.first) .having((state) => state.iso, 'iso', const IsoValue(200, StopType.full)) .having((state) => state.nd, 'nd', NdValue.values.first) .having((state) => state.isMetering, 'isMetering', false), @@ -213,7 +205,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -222,7 +213,6 @@ void main() { bloc.add(const IsoChangedEvent(IsoValue(100, StopType.full))); }, verify: (_) { - verify(() => meteringInteractor.film = Film.values.first).called(1); verifyNever(() => meteringInteractor.iso = const IsoValue(100, StopType.full)); }, expect: () => [], @@ -233,7 +223,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -244,14 +233,12 @@ void main() { bloc.onCommunicationState(const communication_states.MeteringEndedState(2)); }, verify: (_) { - verify(() => meteringInteractor.film = Film.values.first).called(1); verify(() => meteringInteractor.iso = const IsoValue(200, StopType.full)).called(1); }, expect: () => [ isA() .having((state) => state.ev100, 'ev100', 1.0) .having((state) => state.ev, 'ev', 2.0) - .having((state) => state.film, 'film', Film.values.first) .having((state) => state.iso, 'iso', const IsoValue(200, StopType.full)) .having((state) => state.nd, 'nd', NdValue.values.first) .having((state) => state.isMetering, 'isMetering', false), @@ -259,7 +246,6 @@ void main() { isA() .having((state) => state.ev100, 'ev100', 2.0) .having((state) => state.ev, 'ev', 3.0) - .having((state) => state.film, 'film', Film.values.first) .having((state) => state.iso, 'iso', const IsoValue(200, StopType.full)) .having((state) => state.nd, 'nd', NdValue.values.first) .having((state) => state.isMetering, 'isMetering', false), @@ -276,7 +262,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -291,7 +276,6 @@ void main() { isA() .having((state) => state.ev100, 'ev100', 1.0) .having((state) => state.ev, 'ev', 0.0) - .having((state) => state.film, 'film', Film.values[1]) .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) .having((state) => state.nd, 'nd', const NdValue(2)) .having((state) => state.isMetering, 'isMetering', false), @@ -303,7 +287,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: null, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -318,7 +301,6 @@ void main() { isA() .having((state) => state.ev100, 'ev100', null) .having((state) => state.ev, 'ev', null) - .having((state) => state.film, 'film', Film.values[1]) .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) .having((state) => state.nd, 'nd', const NdValue(2)) .having((state) => state.isMetering, 'isMetering', false), @@ -330,7 +312,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -349,7 +330,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -366,7 +346,6 @@ void main() { isA() .having((state) => state.ev100, 'ev100', 1.0) .having((state) => state.ev, 'ev', 0.0) - .having((state) => state.film, 'film', Film.values[1]) .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) .having((state) => state.nd, 'nd', const NdValue(2)) .having((state) => state.isMetering, 'isMetering', false), @@ -374,7 +353,6 @@ void main() { isA() .having((state) => state.ev100, 'ev100', 2.0) .having((state) => state.ev, 'ev', 1.0) - .having((state) => state.film, 'film', Film.values[1]) .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) .having((state) => state.nd, 'nd', const NdValue(2)) .having((state) => state.isMetering, 'isMetering', false), @@ -383,115 +361,6 @@ void main() { }, ); - group( - '`FilmChangedEvent`', - () { - blocTest( - 'Pick different film with different ISO', - build: () => bloc, - seed: () => MeteringDataState( - ev100: 1.0, - film: const FomapanFilm.creative100(), - iso: const IsoValue(100, StopType.full), - nd: NdValue.values.first, - isMetering: false, - ), - act: (bloc) async { - bloc.add(const FilmChangedEvent(FomapanFilm.creative200())); - }, - verify: (_) { - verify(() => meteringInteractor.film = const FomapanFilm.creative200()).called(1); - verify(() => meteringInteractor.iso = const IsoValue(200, StopType.full)).called(1); - }, - expect: () => [ - isA() - .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.ev, 'ev', 2.0) - .having((state) => state.film, 'film', const FomapanFilm.creative200()) - .having((state) => state.iso, 'iso', const IsoValue(200, StopType.full)) - .having((state) => state.nd, 'nd', NdValue.values.first) - .having((state) => state.isMetering, 'isMetering', false), - ], - ); - - blocTest( - 'Pick different film with same ISO', - build: () => bloc, - seed: () => MeteringDataState( - ev100: 1.0, - film: const FomapanFilm.creative100(), - iso: const IsoValue(100, StopType.full), - nd: NdValue.values.first, - isMetering: false, - ), - act: (bloc) async { - bloc.add(const FilmChangedEvent(IlfordFilm.delta100())); - }, - verify: (_) { - verify(() => meteringInteractor.film = const IlfordFilm.delta100()).called(1); - verifyNever(() => meteringInteractor.iso = const IsoValue(100, StopType.full)); - }, - expect: () => [ - isA() - .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.ev, 'ev', 1.0) - .having((state) => state.film, 'film', const IlfordFilm.delta100()) - .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) - .having((state) => state.nd, 'nd', NdValue.values.first) - .having((state) => state.isMetering, 'isMetering', false), - ], - ); - - blocTest( - 'Pick same film', - build: () => bloc, - seed: () => MeteringDataState( - ev100: 1.0, - film: const FomapanFilm.creative100(), - iso: const IsoValue(100, StopType.full), - nd: NdValue.values.first, - isMetering: false, - ), - act: (bloc) async { - bloc.add(const FilmChangedEvent(FomapanFilm.creative100())); - }, - verify: (_) { - verifyNever(() => meteringInteractor.film = const FomapanFilm.creative100()); - }, - expect: () => [], - ); - - blocTest( - 'Pick `Film.other()`', - build: () => bloc, - seed: () => MeteringDataState( - ev100: 1.0, - film: const FomapanFilm.creative100(), - iso: const IsoValue(100, StopType.full), - nd: NdValue.values.first, - isMetering: false, - ), - act: (bloc) async { - bloc.add(const FilmChangedEvent(Film.other())); - }, - verify: (_) { - verify(() => meteringInteractor.film = const Film.other()).called(1); - verifyNever(() => meteringInteractor.iso = const IsoValue(0, StopType.full)); - verifyNever(() => meteringInteractor.responseVibration()); - }, - expect: () => [ - isA() - .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.ev, 'ev', 1.0) - .having((state) => state.film, 'film', const Film.other()) - .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) - .having((state) => state.nd, 'nd', NdValue.values.first) - .having((state) => state.isMetering, 'isMetering', false), - ], - ); - }, - ); - group( '`EquipmentProfileChangedEvent`', () { @@ -509,7 +378,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values.first, isMetering: false, @@ -518,7 +386,6 @@ void main() { bloc.add(EquipmentProfileChangedEvent(reducedProfile)); }, verify: (_) { - verifyNever(() => meteringInteractor.film = const Film.other()); verifyNever(() => meteringInteractor.iso = reducedProfile.isoValues.first); verifyNever(() => meteringInteractor.ndFilter = reducedProfile.ndValues.first); verifyNever(() => meteringInteractor.responseVibration()); @@ -531,7 +398,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: IsoValue.values[2], nd: NdValue.values.first, isMetering: false, @@ -540,7 +406,6 @@ void main() { bloc.add(EquipmentProfileChangedEvent(reducedProfile)); }, verify: (_) { - verify(() => meteringInteractor.film = const Film.other()).called(1); verify(() => meteringInteractor.iso = reducedProfile.isoValues.first).called(1); verifyNever(() => meteringInteractor.ndFilter = reducedProfile.ndValues.first); verify(() => meteringInteractor.responseVibration()).called(1); @@ -548,7 +413,6 @@ void main() { expect: () => [ isA() .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.film, 'film', const Film.other()) .having((state) => state.iso, 'iso', reducedProfile.isoValues.first) .having((state) => state.nd, 'nd', NdValue.values.first) .having((state) => state.isMetering, 'isMetering', false), @@ -560,7 +424,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: const IsoValue(100, StopType.full), nd: NdValue.values[4], isMetering: false, @@ -569,7 +432,6 @@ void main() { bloc.add(EquipmentProfileChangedEvent(reducedProfile)); }, verify: (_) { - verifyNever(() => meteringInteractor.film = const Film.other()); verifyNever(() => meteringInteractor.iso = reducedProfile.isoValues.first); verify(() => meteringInteractor.ndFilter = reducedProfile.ndValues.first).called(1); verify(() => meteringInteractor.responseVibration()).called(1); @@ -577,7 +439,6 @@ void main() { expect: () => [ isA() .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.film, 'film', Film.values[1]) .having((state) => state.iso, 'iso', const IsoValue(100, StopType.full)) .having((state) => state.nd, 'nd', reducedProfile.ndValues.first) .having((state) => state.isMetering, 'isMetering', false), @@ -589,7 +450,6 @@ void main() { build: () => bloc, seed: () => MeteringDataState( ev100: 1.0, - film: Film.values[1], iso: IsoValue.values[2], nd: NdValue.values[4], isMetering: false, @@ -598,7 +458,6 @@ void main() { bloc.add(EquipmentProfileChangedEvent(reducedProfile)); }, verify: (_) { - verify(() => meteringInteractor.film = const Film.other()).called(1); verify(() => meteringInteractor.iso = reducedProfile.isoValues.first).called(1); verify(() => meteringInteractor.ndFilter = reducedProfile.ndValues.first).called(1); verify(() => meteringInteractor.responseVibration()).called(1); @@ -606,7 +465,6 @@ void main() { expect: () => [ isA() .having((state) => state.ev100, 'ev100', 1.0) - .having((state) => state.film, 'film', const Film.other()) .having((state) => state.iso, 'iso', reducedProfile.isoValues.first) .having((state) => state.nd, 'nd', reducedProfile.ndValues.first) .having((state) => state.isMetering, 'isMetering', false), diff --git a/test/screens/metering/screen_metering_test.dart b/test/screens/metering/screen_metering_test.dart index bb50168..ffcca8d 100644 --- a/test/screens/metering/screen_metering_test.dart +++ b/test/screens/metering/screen_metering_test.dart @@ -1,6 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; -import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/screens/metering/screen_metering.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; @@ -19,7 +18,6 @@ void main() { ev, StopType.full, defaultEquipmentProfile, - const Film.other(), ); test('isNan', () { @@ -42,7 +40,6 @@ void main() { ev, StopType.full, defaultEquipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -142,7 +139,6 @@ void main() { ev, StopType.half, defaultEquipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -242,7 +238,6 @@ void main() { ev, StopType.third, defaultEquipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -356,7 +351,6 @@ void main() { ev, StopType.full, equipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -456,7 +450,6 @@ void main() { ev, StopType.half, equipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -556,7 +549,6 @@ void main() { ev, StopType.third, equipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -669,7 +661,6 @@ void main() { ev, StopType.full, equipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -769,7 +760,6 @@ void main() { ev, StopType.half, equipmentProfile, - const Film.other(), ); test('EV 1', () { @@ -869,7 +859,6 @@ void main() { ev, StopType.third, equipmentProfile, - const Film.other(), ); test('EV 1', () { From 0fbf252d9e65f9344ae0bfbe4c8af50eeb64eff0 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 17 Sep 2023 22:29:02 +0200 Subject: [PATCH 39/49] ML-117 Improve description of paid features (#119) * wip * added `LightmeterProSettingsSection` * hide Pro section on purchase * `ElevatedButton` -> `FilledButton` * moved Pro description to iap/README.md * intl * disable only list tiles * show iap dialog on every iap list tile --- iap/README.md | 17 +++++++++ lib/l10n/intl_en.arb | 8 +++-- lib/l10n/intl_fr.arb | 8 +++-- lib/l10n/intl_ru.arb | 8 +++-- lib/l10n/intl_zh.arb | 8 +++-- .../buy_pro/widget_list_tile_buy_pro.dart | 20 +++++++++++ ...idget_settings_section_lightmeter_pro.dart | 16 +++++++++ .../iap_list_tile/widget_list_tile_iap.dart | 17 +++++++-- .../widget_settings_section.dart | 35 ++++++++----------- .../components/utils/show_buy_pro_dialog.dart | 31 ++++++++++++++++ lib/screens/settings/screen_settings.dart | 4 +++ 11 files changed, 142 insertions(+), 30 deletions(-) create mode 100644 iap/README.md create mode 100644 lib/screens/settings/components/lightmeter_pro/components/buy_pro/widget_list_tile_buy_pro.dart create mode 100644 lib/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart create mode 100644 lib/screens/settings/components/utils/show_buy_pro_dialog.dart diff --git a/iap/README.md b/iap/README.md new file mode 100644 index 0000000..d978bb0 --- /dev/null +++ b/iap/README.md @@ -0,0 +1,17 @@ +# Lightmeter Pro + +### Equipment profiles + +Each equipment profile allows you to select: + +- Aperture values and shutter speeds, that your lens and camera have +- ND filters, that fit the chosen lens +- ISO values, that your camera supports + +Creating multiple profiles for different cameras and lenses allows you to easily switch between them and always have the relevant readings. + +### Films in use + +Select the films that you usually use. Selecting one will apply a correction to shutter speeds greater than 1" to compensate for the reciprocity failure. + +Each equipment profile allows you to select:\n- Aperture values and shutter speeds, that your lens and camera have\n- ND filters, that fit the chosen lens\n- ISO values, that your camera supports\nCreating multiple profiles for different cameras and lenses allows you to easily switch between them and always have the relevant readings! \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 364deec..4e12ad8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -92,5 +92,9 @@ "type": "String" } } - } -} + }, + "buyLightmeterPro": "Buy Lightmeter Pro", + "lightmeterPro": "Lightmeter Pro", + "lightmeterProDescription": "Unlocks extra features, such as equipment profiles containing filters for aperture, shutter speed, and more; and a list of films with compensation for what's known as reciprocity failure.\n\nThe source code of Lightmeter is available on GitHub. You are welcome to compile it yourself. However, if you want to support the development and receive new features and updates, consider purchasing Lightmeter Pro.", + "buy": "Buy" +} \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 22b0356..5946d5b 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -92,5 +92,9 @@ "type": "String" } } - } -} + }, + "buyLightmeterPro": "Acheter Lightmeter Pro", + "lightmeterPro": "Lightmeter Pro", + "lightmeterProDescription": "Déverrouille des fonctionnalités supplémentaires, telles que des profils d'équipement contenant des filtres pour l'ouverture, la vitesse d'obturation et plus encore, ainsi qu'une liste de films avec une compensation pour ce que l'on appelle l'échec de réciprocité.\n\nLe code source du Lightmeter est disponible sur GitHub. Vous pouvez le compiler vous-même. Cependant, si vous souhaitez soutenir le développement et recevoir de nouvelles fonctionnalités et mises à jour, envisagez d'acheter Lightmeter Pro.", + "buy": "Acheter" +} \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 9ce0d9b..9f428c4 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -92,5 +92,9 @@ "type": "String" } } - } -} + }, + "buyLightmeterPro": "Купить Lightmeter Pro", + "lightmeterPro": "Lightmeter Pro", + "lightmeterProDescription": "Даёт доступ к таким функциям как профили оборудования, содержащие фильтры для диафрагмы, выдержки и других значений, а также набору пленок с компенсацией эффекта Шварцшильда.\n\nИсходный код Lightmeter доступен на GitHub. Вы можете собрать его самостоятельно. Однако если вы хотите поддержать разработку и получать новые функции и обновления, то приобретите Lightmeter Pro.", + "buy": "Купить" +} \ No newline at end of file diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 357ef95..92f19ee 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -92,5 +92,9 @@ "type": "String" } } - } -} + }, + "buyLightmeterPro": "Buy Lightmeter Pro", + "lightmeterPro": "Lightmeter Pro", + "lightmeterProDescription": "Unlocks extra features, such as equipment profiles containing filters for aperture, shutter speed, and more; and a list of films with compensation for what's known as reciprocity failure.\n\nThe source code of Lightmeter is available on GitHub. You are welcome to compile it yourself. However, if you want to support the development and receive new features and updates, consider purchasing Lightmeter Pro.", + "buy": "Buy" +} \ No newline at end of file diff --git a/lib/screens/settings/components/lightmeter_pro/components/buy_pro/widget_list_tile_buy_pro.dart b/lib/screens/settings/components/lightmeter_pro/components/buy_pro/widget_list_tile_buy_pro.dart new file mode 100644 index 0000000..11e8a4f --- /dev/null +++ b/lib/screens/settings/components/lightmeter_pro/components/buy_pro/widget_list_tile_buy_pro.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart'; +import 'package:lightmeter/screens/settings/components/utils/show_buy_pro_dialog.dart'; + +class BuyProListTile extends StatelessWidget { + const BuyProListTile({super.key}); + + @override + Widget build(BuildContext context) { + return IAPListTile( + leading: const Icon(Icons.star), + title: Text(S.of(context).buyLightmeterPro), + onTap: () { + showBuyProDialog(context); + }, + showPendingTrailing: true, + ); + } +} diff --git a/lib/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart b/lib/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart new file mode 100644 index 0000000..c060dc1 --- /dev/null +++ b/lib/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/screens/settings/components/lightmeter_pro/components/buy_pro/widget_list_tile_buy_pro.dart'; +import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; + +class LightmeterProSettingsSection extends StatelessWidget { + const LightmeterProSettingsSection({super.key}); + + @override + Widget build(BuildContext context) { + return SettingsSection( + title: S.of(context).lightmeterPro, + children: const [BuyProListTile()], + ); + } +} diff --git a/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart b/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart index 8c79f37..cf65ade 100644 --- a/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart +++ b/lib/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:lightmeter/res/dimens.dart'; +import 'package:lightmeter/screens/settings/components/utils/show_buy_pro_dialog.dart'; import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; /// Depends on the product status and replaces [onTap] with purchase callback @@ -8,26 +10,37 @@ class IAPListTile extends StatelessWidget { final Icon leading; final Text title; final VoidCallback onTap; + final bool showPendingTrailing; const IAPListTile({ this.product = IAPProductType.paidFeatures, required this.leading, required this.title, required this.onTap, + this.showPendingTrailing = false, super.key, }); @override Widget build(BuildContext context) { + final status = IAPProducts.productOf(context, IAPProductType.paidFeatures)?.status; + final isPending = status == IAPProductStatus.purchased || status == null; return ListTile( leading: leading, title: title, - onTap: switch (IAPProducts.productOf(context, product)?.status) { - IAPProductStatus.purchasable => () => IAPProductsProvider.of(context).buy(product), + onTap: switch (status) { + IAPProductStatus.purchasable => () => showBuyProDialog(context), IAPProductStatus.pending => null, IAPProductStatus.purchased => onTap, null => null, }, + trailing: showPendingTrailing && isPending + ? const SizedBox( + height: Dimens.grid24, + width: Dimens.grid24, + child: CircularProgressIndicator(), + ) + : null, ); } } diff --git a/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart b/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart index 9f88d7d..be62847 100644 --- a/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart +++ b/lib/screens/settings/components/shared/settings_section/widget_settings_section.dart @@ -4,12 +4,10 @@ import 'package:lightmeter/res/dimens.dart'; class SettingsSection extends StatelessWidget { final String title; final List children; - final bool enabled; const SettingsSection({ required this.title, required this.children, - this.enabled = true, super.key, }); @@ -25,25 +23,22 @@ class SettingsSection extends StatelessWidget { child: Card( child: Padding( padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM), - child: Opacity( - opacity: enabled ? Dimens.enabledOpacity : Dimens.disabledOpacity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), - child: Text( - title, - style: Theme.of(context) - .textTheme - .labelLarge - ?.copyWith(color: Theme.of(context).colorScheme.onSurface), - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + child: Text( + title, + style: Theme.of(context) + .textTheme + .labelLarge + ?.copyWith(color: Theme.of(context).colorScheme.onSurface), ), - ...children, - ], - ), + ), + ...children, + ], ), ), ), diff --git a/lib/screens/settings/components/utils/show_buy_pro_dialog.dart b/lib/screens/settings/components/utils/show_buy_pro_dialog.dart new file mode 100644 index 0000000..0333570 --- /dev/null +++ b/lib/screens/settings/components/utils/show_buy_pro_dialog.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/res/dimens.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; + +Future showBuyProDialog(BuildContext context) { + return showDialog( + context: context, + builder: (_) => AlertDialog( + icon: const Icon(Icons.star), + titlePadding: Dimens.dialogIconTitlePadding, + title: Text(S.of(context).lightmeterPro), + contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingL), + content: SingleChildScrollView(child: Text(S.of(context).lightmeterProDescription)), + actionsPadding: Dimens.dialogActionsPadding, + actions: [ + TextButton( + onPressed: Navigator.of(context).pop, + child: Text(S.of(context).cancel), + ), + FilledButton( + onPressed: () { + Navigator.of(context).pop(); + IAPProductsProvider.of(context).buy(IAPProductType.paidFeatures); + }, + child: Text(S.of(context).buy), + ), + ], + ), + ); +} diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 7d057cf..3f1c0a6 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -3,10 +3,12 @@ import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/about/widget_settings_section_about.dart'; import 'package:lightmeter/screens/settings/components/equipment/widget_settings_section_equipment.dart'; import 'package:lightmeter/screens/settings/components/general/widget_settings_section_general.dart'; +import 'package:lightmeter/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart'; import 'package:lightmeter/screens/settings/components/metering/widget_settings_section_metering.dart'; import 'package:lightmeter/screens/settings/components/theme/widget_settings_section_theme.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @@ -43,6 +45,8 @@ class _SettingsScreenState extends State { SliverList( delegate: SliverChildListDelegate( [ + if (!IAPProducts.isPurchased(context, IAPProductType.paidFeatures)) + const LightmeterProSettingsSection(), const MeteringSettingsSection(), const EquipmentSettingsSection(), const GeneralSettingsSection(), From abbc4c92de97f4eede0dc20c436b5725bebdd416 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:59:53 +0200 Subject: [PATCH 40/49] ML-113 Add ability to copy equipment profile (#120) * Display range values instead of values count * copy equipment profile * added `IconButton` tooltips --- .../providers/equipment_profile_provider.dart | 2 +- lib/l10n/intl_en.arb | 14 +++- lib/l10n/intl_fr.arb | 14 +++- lib/l10n/intl_ru.arb | 14 +++- lib/l10n/intl_zh.arb | 14 +++- .../widget_bottom_controls.dart | 6 ++ .../widget_slider_exposure_offset.dart | 2 + .../widget_list_tiles_equipments.dart | 22 ++---- .../widget_container_equipment_profile.dart | 70 +++++++++++++------ .../screen_equipment_profile.dart | 14 ++-- .../widget_dialog_calibration.dart | 1 + .../dialog_filter/widget_dialog_filter.dart | 3 + lib/screens/settings/screen_settings.dart | 6 -- .../shared/sliver_screen/screen_sliver.dart | 13 +++- 14 files changed, 136 insertions(+), 59 deletions(-) diff --git a/iap/lib/src/providers/equipment_profile_provider.dart b/iap/lib/src/providers/equipment_profile_provider.dart index 92ba8a2..0a037a9 100644 --- a/iap/lib/src/providers/equipment_profile_provider.dart +++ b/iap/lib/src/providers/equipment_profile_provider.dart @@ -36,7 +36,7 @@ class EquipmentProfileProviderState extends State { void setProfile(EquipmentProfile data) {} - void addProfile(String name) {} + void addProfile(String name, [EquipmentProfile? copyFrom]) {} void updateProdile(EquipmentProfile data) {} diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 4e12ad8..259fd0c 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -96,5 +96,17 @@ "buyLightmeterPro": "Buy Lightmeter Pro", "lightmeterPro": "Lightmeter Pro", "lightmeterProDescription": "Unlocks extra features, such as equipment profiles containing filters for aperture, shutter speed, and more; and a list of films with compensation for what's known as reciprocity failure.\n\nThe source code of Lightmeter is available on GitHub. You are welcome to compile it yourself. However, if you want to support the development and receive new features and updates, consider purchasing Lightmeter Pro.", - "buy": "Buy" + "buy": "Buy", + "tooltipAdd": "Add", + "tooltipClose": "Close", + "tooltipExpand": "Expand", + "tooltipCollapse": "Collapse", + "tooltipCopy": "Copy", + "tooltipDelete": "Delete", + "tooltipSelectAll": "Select all", + "tooltipDesecelectAll": "Deselect all", + "tooltipResetToZero": "Reset to zero", + "tooltipUseLightSensor": "Use lightsensor", + "tooltipUseCamera": "Use camera", + "tooltipOpenSettings": "Open settings" } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 5946d5b..2d6d889 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -96,5 +96,17 @@ "buyLightmeterPro": "Acheter Lightmeter Pro", "lightmeterPro": "Lightmeter Pro", "lightmeterProDescription": "Déverrouille des fonctionnalités supplémentaires, telles que des profils d'équipement contenant des filtres pour l'ouverture, la vitesse d'obturation et plus encore, ainsi qu'une liste de films avec une compensation pour ce que l'on appelle l'échec de réciprocité.\n\nLe code source du Lightmeter est disponible sur GitHub. Vous pouvez le compiler vous-même. Cependant, si vous souhaitez soutenir le développement et recevoir de nouvelles fonctionnalités et mises à jour, envisagez d'acheter Lightmeter Pro.", - "buy": "Acheter" + "buy": "Acheter", + "tooltipAdd": "Ajouter", + "tooltipClose": "Fermer", + "tooltipExpand": "Élargir", + "tooltipCollapse": "Effondrement", + "tooltipCopy": "Copie", + "tooltipDelete": "Supprimer", + "tooltipSelectAll": "Tout sélectionner", + "tooltipDesecelectAll": "Désélectionner tout", + "tooltipResetToZero": "Remise à zéro", + "tooltipUseLightSensor": "Utiliser un capteur de lumière", + "tooltipUseCamera": "Utiliser la caméra", + "tooltipOpenSettings": "Ouvrir les paramètres" } \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 9f428c4..72c42f1 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -96,5 +96,17 @@ "buyLightmeterPro": "Купить Lightmeter Pro", "lightmeterPro": "Lightmeter Pro", "lightmeterProDescription": "Даёт доступ к таким функциям как профили оборудования, содержащие фильтры для диафрагмы, выдержки и других значений, а также набору пленок с компенсацией эффекта Шварцшильда.\n\nИсходный код Lightmeter доступен на GitHub. Вы можете собрать его самостоятельно. Однако если вы хотите поддержать разработку и получать новые функции и обновления, то приобретите Lightmeter Pro.", - "buy": "Купить" + "buy": "Купить", + "tooltipAdd": "Добавить", + "tooltipClose": "Закрыть", + "tooltipExpand": "Развернуть", + "tooltipCollapse": "Свернуть", + "tooltipCopy": "Скопировать", + "tooltipDelete": "Удалить", + "tooltipSelectAll": "Выбрать все", + "tooltipDesecelectAll": "Отменить все", + "tooltipResetToZero": "Сбросить до 0", + "tooltipUseLightSensor": "Использовать датчик освещенности", + "tooltipUseCamera": "Использовать камеру", + "tooltipOpenSettings": "Открыть настройки" } \ No newline at end of file diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 92f19ee..391e268 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -96,5 +96,17 @@ "buyLightmeterPro": "Buy Lightmeter Pro", "lightmeterPro": "Lightmeter Pro", "lightmeterProDescription": "Unlocks extra features, such as equipment profiles containing filters for aperture, shutter speed, and more; and a list of films with compensation for what's known as reciprocity failure.\n\nThe source code of Lightmeter is available on GitHub. You are welcome to compile it yourself. However, if you want to support the development and receive new features and updates, consider purchasing Lightmeter Pro.", - "buy": "Buy" + "buy": "Buy", + "tooltipAdd": "Add", + "tooltipClose": "Close", + "tooltipExpand": "Expand", + "tooltipCollapse": "Collapse", + "tooltipCopy": "Copy", + "tooltipDelete": "Delete", + "tooltipSelectAll": "Select all", + "tooltipDesecelectAll": "Deselect all", + "resetToZero": "Reset to zero", + "tooltipUseLightSensor": "Use lightsensor", + "tooltipUseCamera": "Use camera", + "tooltipOpenSettings": "Open settings" } \ No newline at end of file diff --git a/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart b/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart index 54ea810..31ecac4 100644 --- a/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart +++ b/lib/screens/metering/components/bottom_controls/widget_bottom_controls.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; +import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/bottom_controls/components/measure_button/widget_button_measure.dart'; @@ -46,6 +47,10 @@ class MeteringBottomControls extends StatelessWidget { ? Icons.camera_rear : Icons.wb_incandescent, ), + tooltip: + UserPreferencesProvider.evSourceTypeOf(context) != EvSourceType.camera + ? S.of(context).tooltipUseCamera + : S.of(context).tooltipUseLightSensor, ), ), ) @@ -61,6 +66,7 @@ class MeteringBottomControls extends StatelessWidget { child: IconButton( onPressed: onSettings, icon: const Icon(Icons.settings), + tooltip: S.of(context).tooltipOpenSettings, ), ), ), diff --git a/lib/screens/metering/components/camera_container/components/camera_controls/components/exposure_offset_slider/widget_slider_exposure_offset.dart b/lib/screens/metering/components/camera_container/components/camera_controls/components/exposure_offset_slider/widget_slider_exposure_offset.dart index 87539ee..484ee4b 100644 --- a/lib/screens/metering/components/camera_container/components/camera_controls/components/exposure_offset_slider/widget_slider_exposure_offset.dart +++ b/lib/screens/metering/components/camera_container/components/camera_controls/components/exposure_offset_slider/widget_slider_exposure_offset.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/shared/centered_slider/widget_slider_centered.dart'; import 'package:lightmeter/utils/to_string_signed.dart'; @@ -22,6 +23,7 @@ class ExposureOffsetSlider extends StatelessWidget { IconButton( icon: const Icon(Icons.sync), onPressed: value != 0.0 ? () => onChanged(0.0) : null, + tooltip: S.of(context).tooltipResetToZero, ), Expanded( child: Row( diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart index 482c370..bb3651d 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart @@ -36,9 +36,6 @@ class EquipmentListTiles extends StatelessWidget { title: S.of(context).isoValues, description: S.of(context).isoValuesFilterDescription, values: IsoValue.values, - valuesCount: selectedIsoValues.length == IsoValue.values.length - ? S.of(context).equipmentProfileAllValues - : selectedIsoValues.length.toString(), selectedValues: selectedIsoValues, rangeSelect: false, onChanged: onIsoValuesSelecred, @@ -48,9 +45,6 @@ class EquipmentListTiles extends StatelessWidget { title: S.of(context).ndFilters, description: S.of(context).ndFiltersFilterDescription, values: NdValue.values, - valuesCount: selectedNdValues.length == NdValue.values.length - ? S.of(context).equipmentProfileAllValues - : selectedNdValues.length.toString(), selectedValues: selectedNdValues, rangeSelect: false, onChanged: onNdValuesSelected, @@ -60,9 +54,6 @@ class EquipmentListTiles extends StatelessWidget { title: S.of(context).apertureValues, description: S.of(context).apertureValuesFilterDescription, values: ApertureValue.values, - valuesCount: selectedApertureValues.length == ApertureValue.values.length - ? S.of(context).equipmentProfileAllValues - : selectedApertureValues.length.toString(), selectedValues: selectedApertureValues, rangeSelect: true, onChanged: onApertureValuesSelected, @@ -72,9 +63,6 @@ class EquipmentListTiles extends StatelessWidget { title: S.of(context).shutterSpeedValues, description: S.of(context).shutterSpeedValuesFilterDescription, values: ShutterSpeedValue.values, - valuesCount: selectedShutterSpeedValues.length == ShutterSpeedValue.values.length - ? S.of(context).equipmentProfileAllValues - : selectedShutterSpeedValues.length.toString(), selectedValues: selectedShutterSpeedValues, rangeSelect: true, onChanged: onShutterSpeedValuesSelected, @@ -87,7 +75,6 @@ class EquipmentListTiles extends StatelessWidget { class _EquipmentListTile extends StatelessWidget { final IconData icon; final String title; - final String valuesCount; final String description; final List selectedValues; final List values; @@ -97,7 +84,6 @@ class _EquipmentListTile extends StatelessWidget { const _EquipmentListTile({ required this.icon, required this.title, - required this.valuesCount, required this.description, required this.selectedValues, required this.values, @@ -111,7 +97,13 @@ class _EquipmentListTile extends StatelessWidget { return ListTile( leading: Icon(icon), title: Text(title), - trailing: Text(valuesCount), + trailing: rangeSelect + ? Text("${selectedValues.first} - ${selectedValues.last}") + : Text( + values.length == selectedValues.length + ? S.of(context).equipmentProfileAllValues + : selectedValues.length.toString(), + ), onTap: () { showDialog>( context: context, diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index 244ddce..bca15d8 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; +import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart'; import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; @@ -10,12 +11,14 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileContainer extends StatefulWidget { final EquipmentProfile data; final ValueChanged onUpdate; + final VoidCallback onCopy; final VoidCallback onDelete; final VoidCallback onExpand; const EquipmentProfileContainer({ required this.data, required this.onUpdate, + required this.onCopy, required this.onDelete, required this.onExpand, super.key, @@ -85,19 +88,9 @@ class EquipmentProfileContainerState extends State ), ], ), - trailing: Row( - mainAxisAlignment: MainAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - children: [ - _AnimatedArrowButton( - controller: _controller, - onPressed: () => _expanded ? collapse() : expand(), - ), - IconButton( - onPressed: widget.onDelete, - icon: const Icon(Icons.delete), - ), - ], + trailing: _AnimatedArrowButton( + controller: _controller, + onPressed: () => _expanded ? collapse() : expand(), ), onTap: () => _expanded ? _showNameDialog() : expand(), ), @@ -120,6 +113,8 @@ class EquipmentProfileContainerState extends State _equipmentData = _equipmentData.copyWith(shutterSpeedValues: value); widget.onUpdate(_equipmentData); }, + onCopy: widget.onCopy, + onDelete: widget.onDelete, ), ], ), @@ -194,6 +189,7 @@ class _AnimatedArrowButton extends AnimatedWidget { angle: _progress.value * pi, child: const Icon(Icons.keyboard_arrow_down), ), + tooltip: _progress.value == 0 ? S.of(context).tooltipExpand : S.of(context).tooltipCollapse, ); } } @@ -204,6 +200,8 @@ class _AnimatedEquipmentListTiles extends AnimatedWidget { final ValueChanged> onIsoValuesSelecred; final ValueChanged> onNdValuesSelected; final ValueChanged> onShutterSpeedValuesSelected; + final VoidCallback onCopy; + final VoidCallback onDelete; const _AnimatedEquipmentListTiles({ required AnimationController controller, @@ -212,6 +210,8 @@ class _AnimatedEquipmentListTiles extends AnimatedWidget { required this.onIsoValuesSelecred, required this.onNdValuesSelected, required this.onShutterSpeedValuesSelected, + required this.onCopy, + required this.onDelete, }) : super(listenable: controller); Animation get _progress => listenable as Animation; @@ -222,19 +222,43 @@ class _AnimatedEquipmentListTiles extends AnimatedWidget { alignment: Alignment.topCenter, size: Size( double.maxFinite, - _progress.value * Dimens.grid56 * 4, + _progress.value * Dimens.grid56 * 5, ), + // https://github.com/gskinnerTeam/flutter-folio/pull/62 child: Opacity( opacity: _progress.value, - child: EquipmentListTiles( - selectedApertureValues: equipmentData.apertureValues, - selectedIsoValues: equipmentData.isoValues, - selectedNdValues: equipmentData.ndValues, - selectedShutterSpeedValues: equipmentData.shutterSpeedValues, - onApertureValuesSelected: onApertureValuesSelected, - onIsoValuesSelecred: onIsoValuesSelecred, - onNdValuesSelected: onNdValuesSelected, - onShutterSpeedValuesSelected: onShutterSpeedValuesSelected, + child: Column( + children: [ + EquipmentListTiles( + selectedApertureValues: equipmentData.apertureValues, + selectedIsoValues: equipmentData.isoValues, + selectedNdValues: equipmentData.ndValues, + selectedShutterSpeedValues: equipmentData.shutterSpeedValues, + onApertureValuesSelected: onApertureValuesSelected, + onIsoValuesSelecred: onIsoValuesSelecred, + onNdValuesSelected: onNdValuesSelected, + onShutterSpeedValuesSelected: onShutterSpeedValuesSelected, + ), + ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + trailing: Row( + mainAxisAlignment: MainAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + onPressed: onCopy, + icon: const Icon(Icons.copy), + tooltip: S.of(context).tooltipCopy, + ), + IconButton( + onPressed: onDelete, + icon: const Icon(Icons.delete), + tooltip: S.of(context).tooltipDelete, + ), + ], + ), + ), + ], ), ), ); diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index a5b0eca..abacf7c 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -34,10 +34,7 @@ class _EquipmentProfilesScreenState extends State { IconButton( onPressed: _addProfile, icon: const Icon(Icons.add), - ), - IconButton( - onPressed: Navigator.of(context).pop, - icon: const Icon(Icons.close), + tooltip: S.of(context).tooltipAdd, ), ], slivers: profilesCount == 1 @@ -69,6 +66,7 @@ class _EquipmentProfilesScreenState extends State { data: profile, onExpand: () => _keepExpandedAt(index), onUpdate: _updateProfileAt, + onCopy: () => _addProfile(profile), onDelete: () => _removeProfileAt(profile), ), ); @@ -81,13 +79,13 @@ class _EquipmentProfilesScreenState extends State { ); } - void _addProfile() { + void _addProfile([EquipmentProfile? copyFrom]) { showDialog( context: context, builder: (_) => const EquipmentProfileNameDialog(), - ).then((value) { - if (value != null) { - EquipmentProfileProvider.of(context).addProfile(value); + ).then((name) { + if (name != null) { + EquipmentProfileProvider.of(context).addProfile(name, copyFrom); } }); } diff --git a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart index 69a4f00..56c4ed0 100644 --- a/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart +++ b/lib/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart @@ -117,6 +117,7 @@ class _CalibrationUnit extends StatelessWidget { IconButton( onPressed: onReset, icon: const Icon(Icons.sync), + tooltip: S.of(context).tooltipResetToZero, ), ], ) diff --git a/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart index 8bafcae..af2b35d 100644 --- a/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart +++ b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart @@ -85,6 +85,9 @@ class _DialogFilterState extends State> { padding: EdgeInsets.zero, icon: Icon(_hasAnyUnselected ? Icons.select_all : Icons.deselect), onPressed: _toggleAll, + tooltip: _hasAnyUnselected + ? S.of(context).tooltipSelectAll + : S.of(context).tooltipDesecelectAll, ), ), const Spacer(), diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 3f1c0a6..4102282 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -35,12 +35,6 @@ class _SettingsScreenState extends State { return ScaffoldMessenger( child: SliverScreen( title: S.of(context).settings, - appBarActions: [ - IconButton( - onPressed: Navigator.of(context).pop, - icon: const Icon(Icons.close), - ), - ], slivers: [ SliverList( delegate: SliverChildListDelegate( diff --git a/lib/screens/shared/sliver_screen/screen_sliver.dart b/lib/screens/shared/sliver_screen/screen_sliver.dart index 20d2e66..97ed830 100644 --- a/lib/screens/shared/sliver_screen/screen_sliver.dart +++ b/lib/screens/shared/sliver_screen/screen_sliver.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; class SliverScreen extends StatelessWidget { @@ -8,7 +9,7 @@ class SliverScreen extends StatelessWidget { const SliverScreen({ required this.title, - required this.appBarActions, + this.appBarActions = const [], required this.slivers, super.key, }); @@ -36,7 +37,15 @@ class SliverScreen extends StatelessWidget { ), ), ), - actions: appBarActions, + actions: [ + ...appBarActions, + if (Navigator.of(context).canPop()) + IconButton( + onPressed: Navigator.of(context).pop, + icon: const Icon(Icons.close), + tooltip: S.of(context).tooltipClose, + ), + ], ), ...slivers, ], From 90293796975e8a595b20ab4057a905437076f91d Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Tue, 19 Sep 2023 17:25:25 +0200 Subject: [PATCH 41/49] Merged Equipment section into Metering section --- lib/l10n/intl_en.arb | 1 - lib/l10n/intl_fr.arb | 1 - lib/l10n/intl_ru.arb | 1 - lib/l10n/intl_zh.arb | 1 - .../widget_settings_section_equipment.dart | 20 ------------------- .../widget_list_tiles_equipments.dart | 0 .../widget_container_equipment_profile.dart | 4 ++-- .../widget_dialog_equipment_profile_name.dart | 0 .../screen_equipment_profile.dart | 4 ++-- .../widget_list_tile_equipment_profiles.dart | 2 +- .../films/widget_list_tile_films.dart | 0 .../widget_settings_section_metering.dart | 4 ++++ lib/screens/settings/screen_settings.dart | 2 -- 13 files changed, 9 insertions(+), 31 deletions(-) delete mode 100644 lib/screens/settings/components/equipment/widget_settings_section_equipment.dart rename lib/screens/settings/components/{equipment => metering}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart (100%) rename lib/screens/settings/components/{equipment => metering}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart (94%) rename lib/screens/settings/components/{equipment => metering}/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart (100%) rename lib/screens/settings/components/{equipment => metering}/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart (92%) rename lib/screens/settings/components/{equipment => metering}/components/equipment_profiles/widget_list_tile_equipment_profiles.dart (81%) rename lib/screens/settings/components/{equipment => metering}/components/films/widget_list_tile_films.dart (100%) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 259fd0c..2f2fa27 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -44,7 +44,6 @@ "filmPush": "Film (push)", "filmPull": "Film (pull)", "filmReciprocityHint": "Applies correction for shutter speeds grater than 1 second", - "equipment": "Equipment", "equipmentProfileName": "Equipment profile name", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "All", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 2d6d889..895b8e2 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -44,7 +44,6 @@ "filmPush": "Pellicule (push)", "filmPull": "Pellicule (pull)", "filmReciprocityHint": "La correction s'applique aux vitesses d'obturation supérieures à 1 seconde", - "equipment": "Équipement", "equipmentProfileName": "Nom du profil de l'équipement", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "Tout", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 72c42f1..f4c7b0b 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -44,7 +44,6 @@ "filmPush": "Пленка (push)", "filmPull": "Пленка (pull)", "filmReciprocityHint": "Применяет коррекцию для выдержек длиннее 1 секунды", - "equipment": "Оборудование", "equipmentProfileName": "Название профиля", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "Все", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 391e268..3aab33e 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -44,7 +44,6 @@ "filmPush": "胶片 (push)", "filmPull": "胶片 (pull)", "filmReciprocityHint": "Applies correction for shutter speeds grater than 1 second", - "equipment": "设备", "equipmentProfileName": "设备配置名称", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "全部", diff --git a/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart b/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart deleted file mode 100644 index ba3b975..0000000 --- a/lib/screens/settings/components/equipment/widget_settings_section_equipment.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/films/widget_list_tile_films.dart'; -import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; - -class EquipmentSettingsSection extends StatelessWidget { - const EquipmentSettingsSection({super.key}); - - @override - Widget build(BuildContext context) { - return SettingsSection( - title: S.of(context).equipment, - children: const [ - EquipmentProfilesListTile(), - FilmsListTile(), - ], - ); - } -} diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart similarity index 100% rename from lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart rename to lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart similarity index 94% rename from lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart rename to lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index bca15d8..48a9c80 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -4,8 +4,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileContainer extends StatefulWidget { diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart similarity index 100% rename from lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart rename to lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart similarity index 92% rename from lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart rename to lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart index abacf7c..3c72918 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart'; import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; diff --git a/lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart similarity index 81% rename from lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart rename to lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart index 0cb5631..740918f 100644 --- a/lib/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; diff --git a/lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart b/lib/screens/settings/components/metering/components/films/widget_list_tile_films.dart similarity index 100% rename from lib/screens/settings/components/equipment/components/films/widget_list_tile_films.dart rename to lib/screens/settings/components/metering/components/films/widget_list_tile_films.dart diff --git a/lib/screens/settings/components/metering/widget_settings_section_metering.dart b/lib/screens/settings/components/metering/widget_settings_section_metering.dart index c5b9e1d..90de68d 100644 --- a/lib/screens/settings/components/metering/widget_settings_section_metering.dart +++ b/lib/screens/settings/components/metering/widget_settings_section_metering.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/films/widget_list_tile_films.dart'; import 'package:lightmeter/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart'; import 'package:lightmeter/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart'; import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart'; @@ -16,6 +18,8 @@ class MeteringSettingsSection extends StatelessWidget { StopTypeListTile(), CalibrationListTile(), MeteringScreenLayoutListTile(), + EquipmentProfilesListTile(), + FilmsListTile(), ], ); } diff --git a/lib/screens/settings/screen_settings.dart b/lib/screens/settings/screen_settings.dart index 4102282..ea8e1c5 100644 --- a/lib/screens/settings/screen_settings.dart +++ b/lib/screens/settings/screen_settings.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/screens/settings/components/about/widget_settings_section_about.dart'; -import 'package:lightmeter/screens/settings/components/equipment/widget_settings_section_equipment.dart'; import 'package:lightmeter/screens/settings/components/general/widget_settings_section_general.dart'; import 'package:lightmeter/screens/settings/components/lightmeter_pro/widget_settings_section_lightmeter_pro.dart'; import 'package:lightmeter/screens/settings/components/metering/widget_settings_section_metering.dart'; @@ -42,7 +41,6 @@ class _SettingsScreenState extends State { if (!IAPProducts.isPurchased(context, IAPProductType.paidFeatures)) const LightmeterProSettingsSection(), const MeteringSettingsSection(), - const EquipmentSettingsSection(), const GeneralSettingsSection(), const ThemeSettingsSection(), const AboutSettingsSection(), From a5ad3912739cdb6bd4fa2cc476b8ac28ccd78801 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Sep 2023 18:45:24 +0000 Subject: [PATCH 42/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 22d5ddb..72225c4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: Lightmeter app inspired by Material 3 design system. publish_to: "none" -version: 0.14.1+40 +version: 0.15.0+41 environment: sdk: ">=3.0.0 <4.0.0" From 4288be7d57d1504528d8b6802c3925a1b255f53d Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 20 Sep 2023 11:10:54 +0200 Subject: [PATCH 43/49] Use iap v0.4.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 72225c4..7cdec3c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: m3_lightmeter_iap: git: url: "https://github.com/vodemn/m3_lightmeter_iap" - ref: main + ref: v0.4.0 m3_lightmeter_resources: git: url: "https://github.com/vodemn/m3_lightmeter_resources" From cc660de0c4e5ec47f0ebccba3e3437191a97ee44 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 20 Sep 2023 11:58:04 +0200 Subject: [PATCH 44/49] Fixed PR check (#122) * updated stub script to work with tags * depend on step conclusion * check PR number --- .github/scripts/stub_iap.sh | 2 +- .github/workflows/pr_check.yml | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/scripts/stub_iap.sh b/.github/scripts/stub_iap.sh index 210e1ea..5ed6a48 100644 --- a/.github/scripts/stub_iap.sh +++ b/.github/scripts/stub_iap.sh @@ -1,2 +1,2 @@ # https://unix.stackexchange.com/questions/435708/regex-multiline-pattern-and-substitution-replacement -perl -0777 -i -pe 's/( m3_lightmeter_iap:\n)( git:\n url: "https:\/\/github.com\/vodemn\/m3_lightmeter_iap"\n ref: main)/$1 path: iap/sg' pubspec.yaml \ No newline at end of file +perl -0777 -i -pe 's/( m3_lightmeter_iap:\n)( git:\n url: "https:\/\/github.com\/vodemn\/m3_lightmeter_iap"\n ref: v\d{1,2}.\d{1,2}.\d{1,2})/$1 path: iap/sg' pubspec.yaml \ No newline at end of file diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index ac420da..caf7a97 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -17,18 +17,23 @@ jobs: runs-on: macos-11 timeout-minutes: 5 steps: + - uses: 8BitJonny/gh-get-current-pr@2.2.0 + id: PR + - uses: actions/checkout@v3 with: submodules: recursive - name: Connect private iap package uses: webfactory/ssh-agent@v0.8.0 - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + id: fetch-iap + if: steps.PR.outputs.number == 'null' || github.event.pull_request.head.repo.full_name == github.repository with: ssh-private-key: ${{ secrets.M3_LIGHTMETER_IAP_KEY }} - name: Override iap package with stub - if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + id: override-iap + if: steps.fetch-iap.conclusion != 'success' run: bash ./.github/scripts/stub_iap.sh - uses: subosito/flutter-action@v2 @@ -49,8 +54,8 @@ jobs: run: flutter test - name: Analyze project source with stub - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + if: steps.override-iap.conclusion != 'success' run: | bash ./.github/scripts/stub_iap.sh flutter pub get - flutter analyze lib --fatal-infos + flutter analyze lib --fatal-infos \ No newline at end of file From 2a3c6b0b0910992ca34dd3006fe11d7b41381e89 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 20 Sep 2023 12:11:23 +0200 Subject: [PATCH 45/49] Added user feedback label to issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature-request-or-improvement.md | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ba40f08..65d6487 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a bug report to help improve the app title: '' -labels: bug +labels: bug, user feedback assignees: vodemn --- diff --git a/.github/ISSUE_TEMPLATE/feature-request-or-improvement.md b/.github/ISSUE_TEMPLATE/feature-request-or-improvement.md index 381e939..e8b2b0c 100644 --- a/.github/ISSUE_TEMPLATE/feature-request-or-improvement.md +++ b/.github/ISSUE_TEMPLATE/feature-request-or-improvement.md @@ -2,19 +2,16 @@ name: Feature request or improvement about: Suggest an idea for this project title: '' -labels: feature +labels: feature, user feedback assignees: vodemn --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +**Describe the feature or the problem it solves** +A clear and concise description of what the problem is. **Describe the solution you'd like** A clear and concise description of what you want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - **Additional context** Add any other context or screenshots about the feature request here. From 79105ab4f185ea462f84d1c13523e8086af73ade Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 Sep 2023 10:31:50 +0000 Subject: [PATCH 46/49] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 7cdec3c..5454e81 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lightmeter description: Lightmeter app inspired by Material 3 design system. publish_to: "none" -version: 0.15.0+41 +version: 0.15.1+42 environment: sdk: ">=3.0.0 <4.0.0" From 5b1b0b0540547acfa05b5f474f7443428622fab0 Mon Sep 17 00:00:00 2001 From: ScaredCube <74418739+ScaredCube@users.noreply.github.com> Date: Sat, 23 Sep 2023 18:52:58 +0800 Subject: [PATCH 47/49] Update intl_zh.arb of new features (#125) --- lib/l10n/intl_zh.arb | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 3aab33e..0701781 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -43,7 +43,7 @@ "film": "胶片", "filmPush": "胶片 (push)", "filmPull": "胶片 (pull)", - "filmReciprocityHint": "Applies correction for shutter speeds grater than 1 second", + "filmReciprocityHint": "对快门速度超过 1 秒的情况进行修正", "equipmentProfileName": "设备配置名称", "equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileAllValues": "全部", @@ -54,12 +54,12 @@ "shutterSpeedValues": "快门速度", "shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。这通常由您使用的相机机身决定。", "isoValues": "ISO", - "isoValuesFilterDescription": "选择要显示的 ISO。这些值可能是您最常用的值,也可能是相机支持的值。", + "isoValuesFilterDescription": "选择要显示的 ISO 。这些值可能是您最常用的值,也可能是相机支持的值。", "equipmentProfile": "设备配置", "equipmentProfiles": "设备配置", "tapToAdd": "點擊添加", - "filmsInUse": "Films in use", - "filmsInUseDescription": "Select films which you use.", + "filmsInUse": "使用的胶片", + "filmsInUseDescription": "选择你使用的胶片", "general": "通用", "keepScreenOn": "保持屏幕常亮", "haptics": "震动", @@ -92,20 +92,20 @@ } } }, - "buyLightmeterPro": "Buy Lightmeter Pro", + "buyLightmeterPro": "购买 Lightmeter Pro", "lightmeterPro": "Lightmeter Pro", - "lightmeterProDescription": "Unlocks extra features, such as equipment profiles containing filters for aperture, shutter speed, and more; and a list of films with compensation for what's known as reciprocity failure.\n\nThe source code of Lightmeter is available on GitHub. You are welcome to compile it yourself. However, if you want to support the development and receive new features and updates, consider purchasing Lightmeter Pro.", - "buy": "Buy", - "tooltipAdd": "Add", - "tooltipClose": "Close", - "tooltipExpand": "Expand", - "tooltipCollapse": "Collapse", - "tooltipCopy": "Copy", - "tooltipDelete": "Delete", - "tooltipSelectAll": "Select all", - "tooltipDesecelectAll": "Deselect all", - "resetToZero": "Reset to zero", - "tooltipUseLightSensor": "Use lightsensor", - "tooltipUseCamera": "Use camera", - "tooltipOpenSettings": "Open settings" -} \ No newline at end of file + "lightmeterProDescription": "购买以解锁额外功能。例如包含光圈、快门速度等参数的配置文件;以及一个胶卷预设列表来提供倒易率失效时的曝光补偿。\n\n您可以在 GitHub 上获取 Lightmeter 的源代码,欢迎自行编译。不过,如果您想支持开发并获得新功能和更新,请考虑购买 Lightmeter Pro。", + "buy": "购买", + "tooltipAdd": "添加", + "tooltipClose": "关闭", + "tooltipExpand": "展开", + "tooltipCollapse": "崩溃", + "tooltipCopy": "复制", + "tooltipDelete": "删除", + "tooltipSelectAll": "全选", + "tooltipDesecelectAll": "取消全选", + "resetToZero": "重置为零", + "tooltipUseLightSensor": "使用光线传感器", + "tooltipUseCamera": "使用摄像头", + "tooltipOpenSettings": "打开设置" +} From e0320b670420c4131a3105bb641b19044264901b Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Thu, 28 Sep 2023 23:29:33 +0200 Subject: [PATCH 48/49] ML-126 Automate screenshots creation (#127) * Create screenshot_driver.dart * wip * deleted screenshots * iap mock * generate for 3 colors * cleanup * generate single dark screenshots * snake_case * added stub image for camera * scroll to the first checkbox selected * unstub iap * cleanup * Update generate_screenshots.dart * typo --- .gitignore | 3 +- assets/camera_stub_image.jpg | Bin 0 -> 920913 bytes iap/lib/src/data/models/iap_product.dart | 24 +- .../src/providers/iap_products_provider.dart | 28 +- integration_test/generate_screenshots.dart | 294 ++++++++++++++++++ integration_test/generate_screenshots.sh | 10 + lib/application.dart | 113 ++----- lib/application_wrapper.dart | 55 ++++ lib/main_dev.dart | 3 +- lib/main_prod.dart | 3 +- lib/main_release.dart | 3 +- lib/platform_config.dart | 2 + .../bloc_container_camera.dart | 32 +- .../camera_preview/widget_camera_preview.dart | 3 + .../dialog_filter/widget_dialog_filter.dart | 21 ++ pubspec.yaml | 4 + test_driver/screenshot_driver.dart | 42 +++ 17 files changed, 536 insertions(+), 104 deletions(-) create mode 100644 assets/camera_stub_image.jpg create mode 100644 integration_test/generate_screenshots.dart create mode 100644 integration_test/generate_screenshots.sh create mode 100644 lib/application_wrapper.dart create mode 100644 test_driver/screenshot_driver.dart diff --git a/.gitignore b/.gitignore index 3fd9832..703a8b6 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,5 @@ ios/firebase_app_id_file.json ios/Runner/GoogleService-Info.plist /lib/firebase_options.dart -coverage/ \ No newline at end of file +coverage/ +screenshots/ \ No newline at end of file diff --git a/assets/camera_stub_image.jpg b/assets/camera_stub_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70b289f650a8069caf8077398822f1d207983be8 GIT binary patch literal 920913 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

2feyZD zwqbtLSIy{B5k$ZpyaJW*c<0=$RFO?~!Xs?; z$m8vtXk-v<8@Z<{4{Sr7PJjjN1 zB{(ll+MxV#sL*7wHY;80&1p3^nyX@L7ACOG>l4r=XDDmvxrjfiqP;(0dqn43wV7W~ zHAl7NrdzGJ{n!w-h+I&yUSo!G?L5bUDY?H!2So^uE#>k5PoTCWk|g>x8K>AD_0i2} zDTU0ujGOXv`b|sm;BeEIhX%FhW43I4)ojH`mZ~RC<1lloSFz<#Pp-a-zwin9+;rBQ zU*>eSJ>v zgPxy-{*%oL)YM>@d2|#vyh5(Tj*B8r__PeTl!c4hMLobn?FP3x@`MxgfT0qb6(q=q zic_1BV2uiXF@_4uY8%BCcNh_djv7u7tFf2TwGATL>yQz z2ob(YHRWuQ?yO~p3!kG(p89ukjHQ|zofZTEz=VX?h)kuAnX5z!9Wq9U)XE@sh@-jn zf-6T)AEY*K1`OB28=Hcl{hkLiLQr@VSRX|V)lLya5#=bP8DFF0stgmV60ilS2vfmn zd73!E%etCs)=T6F-iszswh*kf%GLY@otw?@a%~ytcX}smRZ4WK!ctDjSu!^g3UaHb z1ot~FWnOTPMpYGurE1U)%6R9&2&Ubnb7Xv>ww-v{%)RIfv{`isLBUN1Csd*n0+&z@ z;kOu-W{{s5tu>=+*l>(Ke#Rx(0)@!Nu@XOZ6*Z6?ZTsS;OM_Gb+Gx{?U>qqy+U|;6db;vl~F_$;fY=8!ZctbA=ZBiPu zxSO;99nfoxfK5aj@Em7^Q{Mu*)Lre5y-|W97+zsp5p8JiF&zmh;Ve0ljc40$l;L08 zWRX4cgjFO@HPdy%N10k+>-LW2rZqyZiryx)-{P}ka0%M`{uW5Z4kLPp66RS}3W{tlEj=*HrV zawN`V)_l-F7nRZ_8h2(on~iW2t%Hcl$niUN2>cGvg@~mnffU6jSw{o`UZ`3gO9NYA zgxZECvXLz(gxqiq@l|39)e(qca!3cLogS4uLj^SLDlX3Lbd#7HYniLe-VP*5jIC_GMN8uIeHLDQ1w#6 z4H9~>$ah%T)@FuuG#n*PT7`SmES1bV49b0^O;JdMa65V&P2mKhr9nhZtwn&&2(GR> z*|xTpBgtAw3saZcX$vfhI^}{=a$pb$=Z04i3;?7<6fetjSSm14Ebuf9z6T|~-i!!f z<@6$gR8h2B2Geb)Sm7M(>_c5R4VkB`b;C#KO8JL zX=31SyjOgGRid$8hZwk-)}4jeIzL(pQB7 ze3%-rjZ*{cEL@Ir;|mWEBN#Vv!O=1y15o9X&cO~5L9vP25B)2!Ra;(opqx{dZwj)r6fAOTgxwyY!yzN}`6__kd%GZB#8t*zt7mvS`b6~f6pA{8%RZwV zUeg}-nVob9yOQ!fd&MI9T=_G$s8>=>k0oNH0F~XlU)Pa(5)>hq9F0{73>vJHA@Ck# z!apR17?SI{#au|7y2FG*T1-18i=72I+{{v{5tLfMQCp0O8!9DfphWD)E?3wv+eil- zvl3p3n>rV5>SAC4VTYH#9-ydct{O_boe%!wkQ&^gHqm=u3wX+%+};YQQ^;mq!DhjB zS8a2;&qpTDfg=$UF;F2PuclF^UK2rQazpKW@+3H6OO#4Mkhg>(s5j0UA9J#m^#&co z9a(qW+6H=cCgr%GmHtE&PD3!(qn!8iLN2j2JdaweDwoa9J)t=Tx}a`7*Z8 z9xW^3ZAi-!8>8gQ=s4=vBinIV1mJSL!C6#n5|B}rkfR46mWLpXQUL&HI+&MmdR=N1o`?wzhr^=PK2KHg?~(J&4Vp4s4vAAKwGm17a(W9Vu4?Yui(DK= zYdPt2X-Ee|ifIg#Tyf9bmn+0cnx~O53X4B%rd7~ZnZpoLq&?2~gN+qxkOP1%6!%A) zaBvgRD~$vp0t<~Vi@UkFHk!#HR=4A5AF9Iqh8%R!UAu-3M`cAfg~WcGREluL{USw$ z(}^ch4qRXrCU1^XW$_cKwJa&6v#QvjN6*s%@d$13;Gl048Ky%ajrz^1QLxRm9J1#N zP~wiz?kEUv+ih+HV9B*Zc5L1w+*L6cA?(6#c6maZE-s~ccb6MA!gq(D#;|6N(wu<0 z%ehKRr!|cTcN7o#!12aQl5KfmtQ~2lSZNp!O=r8xZ|8-o?g*ENWPzj}uR*U6H89;d zTslf@s)k#Zx!z-~M~!u-W*#Q?mL5UIGC4qZ+W3s4>ojvo44mS(Fn=O_gysmLBS)cF z0u*a#)6C-_jIaGhHnR&fiLf1<@nzwpAWkhOPg8Q7Swm2TYlOwNwMg*3W62cCxLTQT zosyy&K?{)%^r&+|6rzI9A8ZMpOsQmPA|N&)rMyw~lwVTsKl{v7U+tz@#(PFZ%ZiM3 z{ww09Ly{P&B&9d1wKUPjt%nUVmfRURmjOV%8Ih$GlQE=z!fGP zr7lmTsqOmSh-#%hW=I7fbVvC92F)B@>cM|wxbFsX3$XG zQFWXrLiMrcVY{$ZkU<@xcI7L%a_3q%*sVds`er(|inyNdBV2TUF;ul>G-E%XnB`pD zM|bJ(iX(BF1JDM>V7hB;g`F@JokdnHazt}z`7*O`cz&h zg$B<))}V9ynr?S`B#~p9+yQGxezS)hwz^WPy~w;zA=pMAG+y?V^`zCSn<- zydoy5nTo2kXs#zSj_9FwoKb+HJhfZYIBTWpax=D*F2_mfhN-zDUD$+jQ%wQekK5u(Yee88#)E@cR^uE-K<>b_aB37~RX3ns4IxWGOwno&RP;6Z z6`8n7_ONgn^j4UeV~dd~5+X)m%79?(%z>9V!zi=&$j5a1yKHlcsc1ECLcQ7^xX-ft z(9pp`bdw;dCf^I~GQU}^ zTmk3|1Il6jN>Nrxo}avW?(}McA9JHCY)nYssc#t zfx&t!sYg}lrPY@l1-^q?VHv8KEr8%02)lr<9T@Xr0UA8oy`hk8d%ZcA5H)NVVbEGD zQ(#`7h?%Y?)7Z9ST-$}hC}hX=L2rjm#NwEu9NPu~TNwmR?QrAf9E31kPGZKP$rzZw zRI|y9X*&|U%V=dDE`u0>Wte#aN6a&fc2*Ixs$*DL7KZ~^LcB5ns}k{!H>Z+C^>FZP zCGAaTgbdE{>;&x={nyP>CPQFz$AhuZ4Iw&A$lp+Bql|?k=78t~;3SGzNOkvwAW}Ps z=n3D>o&s@6RM9vtmxNQ}5%*4c%z@plsQ9C5Pe2z|T&<{`T7jmJP9c!x<-HA^Uziq} z1k;alO$Y~^57VFDBxV9GDkag)MHPxVla!C-k^Pvz;2lgPRd^V?9nOtOwM^F}yayZ_M;>f)0M#i;c7kvKBjXOIupU662UBDwVZ9m0M@e1f zl)@?Sc7Ejpbps$;+S-O`H?kc5PAul4b@bW(Yyn5 zMb<6fAnp>1yO{AAm^Ob@16YFuhTyuU}4Ftr3VqdXl^`&-o9+#Naw zGthaa`0$HgV38KK+k7mjmSP3YvCAySNtEF-FZ%fFQSKpgnl-WP zGNiP)$rfc%k;M=wwa~Q?LUgFByTh2c_iFV{%@T5}`s(rQUN|U1f5GhZ!jAMoauCsF z)X2kW<#XpBWxGIV_s1WI?u2p#n{6kb;*QB%c1$nps6q56RksB(G~+lOvyLtbNBjFw z_B+5Y&7=|_8CPNlqJ~4P_P0taupUw$dNB0)M*5PpHt2D>h18BB?Hz$=b^C~oHE275 z6XgZafQ~&Im1CvmGj#jLw@}zMK%l;6!Ulvc+xeVhRo%SeJO)qKE^<0kt8X_5KIvl6 zG?;J}>k9~IPC0^bRaUAzDW#4QU3}|dSohx2^PBc36Vm$ zU!b#muqX{G$DVK^{86qSSSp!G%JKsPE)YTLHY{X^3c8$AwO~KRphZ=~3)XR6S`a*Q zoGLhP+zDcag(ifiS*It!xaISG3}*54yIH}xogKNhN$0gPzPs%UMqa8WVTmNrgW?3gV2QF z)`~v-pC_sOmE=j=9bm?WH>g?ItXeAnerTt#5Gf-CXTt#-Ou3FC`JP9D(=C~??!p7% zRcgfU9{Z3}iev5RP`{wi&G=?G5G_80JzBvW4?|~pbpRWZ69<@~f>y*EFJ9smnu#hm z6!4)8EAA+>4h9*p$YNIeL`t!DVrY3C@QGnopBa)LS4#8Du8X zxGTEYORI(x!m^#&qR8SRwS0-hqD4@3Nhyi#9aW?3=`V4kDp9!;u@#p^WkA0m)x3`! zsVmCjY(|JVXDC&nG07{u?eQbAgo8yRv1>$G&6{dwL%h*D-8B<6<;Zf#W;x8!xqe2R zVVPs4UlG|51}&K%RGW}qD}5LD{G(Zh6%@aL$s_-7O?YP#YDg~O*?|N$W{aQ|bdE*D zGciz1&pDD`0OwPH#I!*}l2kn2amTSj;T+TwqQ<9MYJsEXScf4CTG$^skbWoo2muFN?y8cR7juE}d_7D>@?D zHmrNy8m}%i>uhNV{t!~rG{CwVlBW_Q@_|@@Q4%z;Mgms30Cq8*KQ_Mq--~EnVkG*N z#qC7$upjvgJm4Ylx`g&C)`=S6!%D(1t>qr<`E}+#C^3c&f`F$WekatrKuxX)%Nw4` zwQ*A|IuD2~JV-Ksj2PEz0+5OU+aHxWKFrJdfR7N@|74mMOsXgzlpv}5HU(Qak+pJL zs2$5zqxmP;T#=h|hJTc zbCa{qV4VqrLY?(SKgwo}`Bi2E zM*>)f29EK>BCoWA2$7r#mDmgL>j*|@tTWuo@+$JpAnj&#EEXsLpyX6IvjuVZPC80!L)3uLhMQTTNb0Ueb)E^h zYZVHV+ez_x*K7C!h_LhHqlf5JQ!mX_kVr>QE6oal##sYb1|BYDrfS6Ib}9*}HgCS^ zP6JE;Me&wHGPol18EluOfW(Z}an+nbctO^D9LKSkP^RZPHOyGBPhcaZ4a&ZE(&c%y z_|S7va($@0$4m(#K-fSGR2yZ&zwlZIB4Gl@4d1myyA601!B%>lA>F>4J@4jE#2E{C zehA^?6)|g?PGDb`1h*C<@-Ss?+i}?HDS+JDCc7o=**CO`zn_O&p31ekd2`Wycl? z1C^E-4k00C1;v<$_+Jc`%P_6QF<|;y6N%L+8JTjDf^lK3!5RfD^r1pYtrz=IP8RU% zUyx{E9~?IBd)tqAXyl@U)mlBjHj?Kd$A^L`lts~Q_8~7aN(ZKVq;Lv}Vwf2u{vX#7 zT%V=8q{Z+eZ#V47Ajz4`lgvqhP4LwaKeILxzPNVrC^?VVQ9M=dHKhAdyCXx|_}|Gg3Gb z4XVvZ`G4PMUXM<4jHDz55(R}3lNeU`CRPBvse`1R{qs>ONS{aNYg^0Vj#2PrU+9^Z zg1!={9TL;Qxp1u38!f|X_D|PCANQaYowBr?yMZruYS8pJrmSbH!byW~3R@FHg>^3^ zHidYW33iQ@V*)FXj=^W16Ty?)WelF-5<)A}Io3SGW?T1!C{TjEXk-+nt7ai&%zw`c zIK{Gb^`JwDNI*hNLx>m402?-udM>Vcx-bZ4IObpjN~1;}3gKa&`wj+iE_SmQ7x-?< zoi0y9=XRK;@V)T31v3~G=w$a~Iib@+(D~#rHEN$=ib-%1y%u^w2!*GTu54% zWQe4&tZ}tG;z}E<6?M!*T^SdbGf7st-!pUUAl@06%-~g(8e< zb5dWrk(IY%)_<=YhwI8hxP=g z4HBYt90HW+(m2Ir0LW=(7+tA69Vu*EYK2=Cp;ufSts`-eStKf0W)}eZ{_isU-}{cm z9XBPyY?J`_4nmUi367;};TEo$#gVX>Ro4AD9p6mO&Vm@I(;<0;abt9FxbPYC2LwCa zX^Zxdn&9fzFXDZyS1`Rb9DLz(Cit0&k_o4cg>WvaArFVZOgO+M5!HUSQxaj5UCiFi z3H5?Ht;QM~f#D2J#a`4l^RQm*NHQJD8kUXp?HJ|u23Es|e&(%e=>LC)(DVNN zJ+5A?E&;|_Q6<7Up?5Ofc{{Enpe$!6(6r`-29y79B~YC?cgYGAtJzipa9LGyI66Pp zzpj&(yR5kTbp?{xc_?`J)Ct<{Mp|Y~hO9g%&@Y2E)p>GCc!K#uCaGem(0fzhSOz!e z%;o65JsGmIFxsbI``(T1XZs;`YK>|1WmDwE%kBp&uBCPF^BZn`UpBdzy#I9hV9y3y zPGl@CfB}W_ZGwx(U1v?OGH8HFk{>Ygnqb=?yh#8L5xP48fNhBy0*psFAE}ps0pp(u zg)?5Jx@)2ITqonGz^n*nJS%9Wvjk`e+5bd0?QrWTK3MP*Mp}ILkS%i>4I?cDG@Ht7Q%;QwEpmf{b6uoj1RBe`W#dMSn zXVF;`s*x;n>PuTIHTm)Oy@kuDBKh)1TLxjL49yj-)DgU z>lxvLOc?b1ZDKjo2$%raWGb{o5+E=Oa*CmXC`4IF^8&5$JL8QziUly9W}^p3UxA%L z6ky31bcA_^QA!5cy+_)>QjyW(HIP8PW`JJkfuK)MIJ4UfMXup0VK`Ww0fMtWn(kS- z_vY?&s(BWU#GrZhGm`^}I}B5{ku@$n-6YD5_M8!^ze1W_p zE9vN9G=YiEB3U3k&U@)h9}hzZ^m7rhw=l;~1f@!GIx_^7#0BoOG9$`r=2)9*z?F8~ z$551#>yAeE1ci9@Vz4H#CU&E)$>4m?Ddt*jkRZTiG5ENYI>tXPHCXe*igT@(8UyU& zWvIM0*?mDOhQ)b`J_$ly`{=-4oJk*WMV@7%)iUMJDd<5>fWX7H+$k@?t;%;xbNrog zHWVd>*Bq3Rqu{gq|G#LHp+p@a3!Q@_L)tQ~hlnz>P*Sliq8>Yx*V+iXn=;G^7q$}r zrCExM7^_TH@!X|!=4Hx^(yam_F}E5F#zyABN+PXMaw^uiar&k`Ko^YyRt6sAQIC*9f5*AP?{Jzg8xB%0XAKVSIVC;hc& ztnXRH%i@<7SGI72n|$me>Pr121i0D5#+*YE-e8NH+LVD&+Bk_Vuo*-pbB*FCfay;X z>N0NB4_X}ro^WeA0n+1`?IHs{lIJSM_b#`^fPWfos87B!{2*0Hrq(>!Uj%n^An z>__=SlWio~>AdW?o-h#@RqBT*Yyp&@XNP#h@V9A#A+Y|4!9fLuMzj|h>PiU{{?^32 z>glXte>mpp38W7Cue+q|xk)J3$pQ0O(n=}Si)G5;gUF5{RXu9EirboyjS}~RU`v2& zQ*JMf*;BDTWOEIs;`aFZ5Ch2*t+V(;A=uNGk#c5E?kZWaCN|l)g4V@{nGB48p8boE zUq}kpLETIcZRoucfr7#`?PI>C7p;3!zdAznQ<)|c=!}V*8kp0kT0m1>m(C<6e!n%C zG6Eba1#%~Gt*w_)oM~ki?j*5#n!6|XEqRgGZ8LF0#NzI29i8HM1vc2 z3DH_l({;onpm#(o!>s8Q1P^Qx6tM;6!nt;%i_zVC8~suCs(I)B{iusI8AGDr|5 zq${Y>9Sd925MFZOiyJS-js70vtiwew#-|I_FYW|I*i&@7OjiYGppGfdwU?MRJ?P$A5ELbD(+ZQgRw`|YN!s$X%vR9x*eU3V-+#Uujo)Ctlf_5sd38-L4SHkd4lQS~ixmTd;_Wcn1RnLn6Tl>r-6)AjNUW&?+YN>WR& zwNj6U!0HzglzY%TC(S!z(KviGfx;>!pRzwFtS*ecxQrI{p0F)#o=y&xlphhkFlqNS z`TKjs(4Pz*kj6u}a1e@5%zfmKZq$;fWrR*(1cW};$DmIq;#EsUM~NRfE1xKl^8*U! zGUV)Ck2H1lJ1J)DSATvM~>aZdTmN%53WFwo}X= zNwfm1FY^k^dRCo6o^fLPnvOjV;><1`Pol^ykGHYD-Bek{zqN%tlb6ITPTu!sbHCl3 zqWhNkVD;UWTQNt3PZ)PHO<(zqo*$}e^R>9VA@=i(l!=TYd}ee#|GZh8?!9?)S>N6k zeurPdsrv_mo(1I=49=-{gne_>%A>cheAe!9sk%1mWO;xiPTZ0IBIWA8_!F;P%7;#O z1?+Pv;FH{6jpvr{mJkmG=M!6Nlm`rRArt0*+PH)jPGKl~zas)`NgttUJ+COT!TDOv z1Cq;RI>d{uG41GYP7!Sfn(!}W6;CJrT{U^TsW0j2=iv|dN7SaTLm&NV_If39w^HxX znzLtcmBrmn_O01AvYgpKhaWy8N7cU`e-|AU>HUMP?CnkUtkpKlRp;}zPnNn(8fv}@ zRZiS|v;W+4?{)m&i;s;BM4wu&em_#T`0glcVqnt$-O<%6V}6}QoxAMO7Jufl!@&7N zDII&(3KAoGp5~3b1V4#0eQ#&}@O0slM{e3&!_MlmZG)%&HKAwiSX?l_m--8@#g|(c zeZ{}@Q>ugA-g2^fENwg~+~4p0l~=gp-~;!M>XSN)`Lmuc?T&^Q_?bOW&!Xg8x~<)8 z+K|?sC(d;-_yWGA4fM%Ub-FB0u58ufC-?tXsg9v0A5_W{Iono?%#&=*nlDc2@yc#u z$i(7Z-uQ>wgZJj*FhTp?IfcGrv@C!Idr6e&7Y&F0%h0;HkdkXZdzUQO?Rs`f{9tM{ zeZTvcMe85L{e5~ZttR@j^fNey%@<$%T|fV``}?iwtKPn$>_~q0`yb7J|4&xCZ1zKB zcGQg@4dUPP*8Lds+RAD;_gQAq`s2C~i@f9YYeo703-&B-{4^r}r-7qmzwUABeIEh^ zkv<&%?(Uxr+y3MFpWA0Yjrjd})PKgZ&*eN{@4en>?B|KpfPdz`t9Siwb-=5kwZDAf zkUsa7NpNJ~+nsCvs;#G-+J4gQ!9u2T?l2~Ta%TU~{JN5yzZ!17S+y~9Zp-`)Oz+!= z>V&j|y{{jBHvPBFqkm6*n=$ck@qs^fJ)W8_9<%-WLHAz=JmclJcO}$koL{Smovz3f z?cM#Z*ddzd^;h%uEk5Vg9taI>!LNoMnKy3yixe=@bY@jU$WLjhe=d={x}(RBjfZ;v zksNh`c9*+?iMd6SIF#q?+oVWnbvOaXh0XiMy$;J}RG(&`UqK0L(jT5T??kCzZaJg9 zOwnKHULAAC^nS?dvT&}VvH6C>`rj0n;bV!&G9qTLQo@ZYD-S_*Ar;2GlfgUR(R*dIBf1IC1S_V{#O$?wjM05w)UeUB z?0jXaF?Qe0#(f&3q4ho^C9P|XHz@c}nFG~mXI?RefM;(eeNcjlsjGQ%SZ9Hi@UYt4 z%{6q%{=gvPPlBd*1qUDq6d1WJJHQqQQ3bfEPYld@O_Ue&GP_5N9Ksbr;WZ*L2ialF z#33DH;Ym4p%H$%4Qh1OkY-KBsI}R%uB-8r8`x89AK+$_+j$i4lHk%#iQPsbV`dgGh zQXVp0QS21U7@5E-8A=ge5qy>MNGUJ!n>g&G?ViRlkf4e^Zjahz1VE#eCMTG-&`VkZ!pakEH2_P2bvlK4w3+frD zZI)-ey`-ICd_W&^`notjGJ5RcG-bIMziawIaMf1x55U- zwo)HqfM+8Br4^nC7k-+~jlao9#RWHaOWjTpCX!^g$1J9p_hxGA(708Dz#QOcdt`3+ zCV8H7l8x(8QaCjJGz|nZ;ksjCWJSGc4{JGey!HLcpf?c9Gt)s03^3hh=?+0x#<7j- z=UN6;-#Q%ET=AD9Xf!Wr7VypS?hE1zl zB+*%SPWu4xp&J9#7y*-J88@&1ds0KKnbS}T8hgp%~vv;xTgMd!P1BIuiP%EVxNwjUn^h7 z`}cqDJnfwMb$_7G*k|hdJ&$g^IvdNo@U-Mp(ZIi)jQ7s}n()Ts{%>yrj8EUa-M{Z~ z{f4Pc4R4SBvMGHbZ~nJiGykmRy{2dK-qg=pfMeT-mX1({*#%K4hzd`8=jur|F`|pg4@lu zMb$aq*0=Z78&7TBxRspvoEqrxa5nGe2j8NtUIBN9S8Q8wr@bpGqPf-35{Bp#x4F_m z!AKnb#!kBnL6es-qbZAf&#BkozPOg%Q!GE`QT;b9ZgT(p#>kx5!@|M%pFEFQ%kMjF zxA;tbkl%DR;@?$UzS*;*>0Pw^PNHXRzE9U=R+8CCCwKol(6h2ej zb6sCTRiVv@!_Wo8mZg6^oJ)cf8N`I{?*qnvU2F_ z5%K+Bew1;I>50E>ir_EXM7RH4+g2HRwdyHj>(;Fsk1HQ#za{w;-Ih3=3mA9Xy>#>C zji8 z>+HYqlI)oOiu+T^nY9Oh=if}9oLFanm};k&?;TiRe?5D8U0<5jzrOX~|MJTI!`=x6 z%Ri=e4qpGzv3B9>_Q#(c`nzk?_Wr7iPj7F$^2KW5&~9#8W9^wy?riRI#=t!XoBF%g zz5lfRy|(+4$qKij98cFjs&AP8@{p+clDpM5;zQe7r=W$|pSq&0A3Tuky0dCGZm8=d zUps!b^ryI-J@pqJs5eBEUS@Uup1F6`)rC#%2Wz{v*j+9U*2hP_#@m_BpUoMZIiHp^ z`{dWN|A`$sxaZJuE~`Cs-=eQ|T3apeP2IB*J4bx9_sOLDcRu+ccfE^aeL!o_k3al} zc=+(CZxub(wa2{jpQSBb^=(}I@?yd-Pe;YI?DY1lhg<8)Hg?KANcNe%lArYr!h8PR z4Y1@rQ0RXtmR;Fu&rqTKilc=^Q_&Y10C(SK!CyNW5#H_ChCeo$RC_h%WoYJy zVDk@gHxUWXvm}(nfb$I)u=P9}lo5tzU>iMNq49ia{+7HVcCXrZ?)z@ktBpRV$G0=r zy1=i@U70-z=Y#YEMRjBEhtbc~v(?X2cOrN6eo!+JL(I*u&J21c!6lzr^&8W;M&YQl z#3f(gPGZXqbtRXT*=DnpS>(OiW74ser1z_RWfPPE^L0OMYgA~Ae^fLd2{I<`^Vld5Ry3gV#-BkRuQSb%hzjUMx*P;H-lR=%{&PDPlv)@uNLQf2h>` zJiBt%ZozXR463dgbMuI;^$1ZXh4?};z-qu&g#cL1e5{Jla~Ua+spl6Yd%jk%@rZyl zYqd9hyD+Bqkdun;zL&s&d56I+vmTcZStxqd`xFR7KUfz>4^SkmmTvsFaKpg&Z@ z=BKB=tTf+ggIzkt;)R!-4D|5(1EBH_RnSi}A_YHta`2k*@ctNjePn#Avd zf5VTa?Zu7MEZnF4u1#y|cDdyFeQ>3I^t{%*jI>cVUMpmN7L8xAWu?<$-;?2u?J`Qa z|2_AoU)6TUo;bU|y1cw}xaGkmhd=&P@ju_JS=Hg(aVVB*h;&-_Nn?L{qBdZ_p72`l>Yd}!E*b{^gZ3*#r_nz?ZXZAzsqxsPj>Yu&aIAh z{q4|$Z_mBnaL&|KwCB(<;^?)B^H*G8IqgIy(;vQF7Qy`1B?>&+(~zNh|H z�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

dnnuNv7_JMV-J{JfLdmnK^U__&;&*!a*XEceu% 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�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

ILs2#%M_s&IqS( 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

54~u%jO~@q#U;d^n>##NEY>L> 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

jI?~&JrR{jni{XK%D>bD(OBTw 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 !g%7QNDrs(*Sx5+8iVl20s8q3r2&N;e<8_k`wz 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 W?by03lT>0?UL^L IAPProductStatus.purchasable; + const IAPProduct({ + required this.storeId, + this.status = IAPProductStatus.purchasable, + }); + + IAPProduct copyWith({IAPProductStatus? status}) => IAPProduct( + storeId: storeId, + status: status ?? this.status, + ); +} + +extension IAPProductTypeExtension on IAPProductType { + String get storeId { + switch (this) { + case IAPProductType.paidFeatures: + return ""; + } + } } diff --git a/iap/lib/src/providers/iap_products_provider.dart b/iap/lib/src/providers/iap_products_provider.dart index 3014cd9..4895fdf 100644 --- a/iap/lib/src/providers/iap_products_provider.dart +++ b/iap/lib/src/providers/iap_products_provider.dart @@ -18,7 +18,12 @@ class IAPProductsProviderState extends State { @override Widget build(BuildContext context) { return IAPProducts( - products: const [], + products: [ + IAPProduct( + storeId: IAPProductType.paidFeatures.storeId, + status: IAPProductStatus.purchased, + ) + ], child: widget.child, ); } @@ -35,13 +40,28 @@ class IAPProducts extends InheritedModel { super.key, }); - static IAPProduct? productOf(BuildContext context, IAPProductType type) => null; + static IAPProduct? productOf(BuildContext context, IAPProductType type) { + final IAPProducts? result = InheritedModel.inheritFrom(context, aspect: type); + return result!._findProduct(type); + } - static bool isPurchased(BuildContext context, IAPProductType type) => false; + static bool isPurchased(BuildContext context, IAPProductType type) { + final IAPProducts? result = InheritedModel.inheritFrom(context, aspect: type); + return result!._findProduct(type)?.status == IAPProductStatus.purchased; + } @override bool updateShouldNotify(IAPProducts oldWidget) => false; @override - bool updateShouldNotifyDependent(covariant IAPProducts oldWidget, Set dependencies) => false; + bool updateShouldNotifyDependent(IAPProducts oldWidget, Set dependencies) => + false; + + IAPProduct? _findProduct(IAPProductType type) { + try { + return products.firstWhere((element) => element.storeId == type.storeId); + } catch (_) { + return null; + } + } } diff --git a/integration_test/generate_screenshots.dart b/integration_test/generate_screenshots.dart new file mode 100644 index 0000000..510c7fb --- /dev/null +++ b/integration_test/generate_screenshots.dart @@ -0,0 +1,294 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:lightmeter/application.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/light_sensor_service.dart'; +import 'package:lightmeter/data/models/ev_source_type.dart'; +import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; +import 'package:lightmeter/data/models/supported_locale.dart'; +import 'package:lightmeter/data/models/theme_type.dart'; +import 'package:lightmeter/data/models/volume_action.dart'; +import 'package:lightmeter/data/permissions_service.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; +import 'package:lightmeter/environment.dart'; +import 'package:lightmeter/generated/l10n.dart'; +import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; +import 'package:lightmeter/res/dimens.dart'; +import 'package:lightmeter/res/theme.dart'; +import 'package:lightmeter/screens/metering/components/bottom_controls/components/measure_button/widget_button_measure.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart'; +import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart'; +import 'package:lightmeter/screens/settings/screen_settings.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class _MockSharedPreferences extends Mock implements SharedPreferences {} + +class _MockUserPreferencesService extends Mock implements UserPreferencesService {} + +class _MockCaffeineService extends Mock implements CaffeineService {} + +class _MockHapticsService extends Mock implements HapticsService {} + +class _MockPermissionsService extends Mock implements PermissionsService {} + +class _MockLightSensorService extends Mock implements LightSensorService {} + +class _MockVolumeEventsService extends Mock implements VolumeEventsService {} + +//https://stackoverflow.com/a/67186625/13167574 +void main() { + late _MockUserPreferencesService mockUserPreferencesService; + late _MockCaffeineService mockCaffeineService; + late _MockHapticsService mockHapticsService; + late _MockPermissionsService mockPermissionsService; + late _MockLightSensorService mockLightSensorService; + late _MockVolumeEventsService mockVolumeEventsService; + + final binding = IntegrationTestWidgetsFlutterBinding(); + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + setUpAll(() { + mockUserPreferencesService = _MockUserPreferencesService(); + when(() => mockUserPreferencesService.evSourceType).thenReturn(EvSourceType.camera); + when(() => mockUserPreferencesService.stopType).thenReturn(StopType.third); + when(() => mockUserPreferencesService.locale).thenReturn(SupportedLocale.en); + when(() => mockUserPreferencesService.caffeine).thenReturn(true); + when(() => mockUserPreferencesService.volumeAction).thenReturn(VolumeAction.shutter); + when(() => mockUserPreferencesService.cameraEvCalibration).thenReturn(0.0); + when(() => mockUserPreferencesService.lightSensorEvCalibration).thenReturn(0.0); + when(() => mockUserPreferencesService.iso).thenReturn(const IsoValue(400, StopType.full)); + when(() => mockUserPreferencesService.ndFilter).thenReturn(NdValue.values.first); + when(() => mockUserPreferencesService.haptics).thenReturn(true); + when(() => mockUserPreferencesService.meteringScreenLayout).thenReturn({ + MeteringScreenLayoutFeature.equipmentProfiles: true, + MeteringScreenLayoutFeature.extremeExposurePairs: true, + MeteringScreenLayoutFeature.filmPicker: true, + MeteringScreenLayoutFeature.histogram: false, + }); + when(() => mockUserPreferencesService.themeType).thenReturn(ThemeType.light); + when(() => mockUserPreferencesService.dynamicColor).thenReturn(false); + + mockCaffeineService = _MockCaffeineService(); + when(() => mockCaffeineService.isKeepScreenOn()).thenAnswer((_) async => false); + when(() => mockCaffeineService.keepScreenOn(true)).thenAnswer((_) async => true); + when(() => mockCaffeineService.keepScreenOn(false)).thenAnswer((_) async => false); + + mockHapticsService = _MockHapticsService(); + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + when(() => mockHapticsService.errorVibration()).thenAnswer((_) async {}); + + mockPermissionsService = _MockPermissionsService(); + when(() => mockPermissionsService.requestCameraPermission()) + .thenAnswer((_) async => PermissionStatus.granted); + when(() => mockPermissionsService.checkCameraPermission()) + .thenAnswer((_) async => PermissionStatus.granted); + + mockLightSensorService = _MockLightSensorService(); + when(() => mockLightSensorService.hasSensor()).thenAnswer((_) async => true); + when(() => mockLightSensorService.luxStream()).thenAnswer((_) => Stream.fromIterable([100])); + + mockVolumeEventsService = _MockVolumeEventsService(); + when(() => mockVolumeEventsService.setVolumeHandling(true)).thenAnswer((_) async => true); + when(() => mockVolumeEventsService.setVolumeHandling(false)).thenAnswer((_) async => false); + when(() => mockVolumeEventsService.volumeButtonsEventStream()) + .thenAnswer((_) => const Stream.empty()); + + when(() => mockHapticsService.quickVibration()).thenAnswer((_) async {}); + when(() => mockHapticsService.responseVibration()).thenAnswer((_) async {}); + }); + + Future pumpApplication(WidgetTester tester) async { + await tester.pumpWidget( + IAPProviders( + sharedPreferences: _MockSharedPreferences(), + child: EquipmentProfiles( + selected: _mockEquipmentProfiles[1], + values: _mockEquipmentProfiles, + child: Films( + selected: const Film('Ilford HP5+', 400), + values: const [Film.other(), Film('Ilford HP5+', 400)], + filmsInUse: const [Film.other(), Film('Ilford HP5+', 400)], + child: ServicesProvider( + environment: const Environment.prod().copyWith(hasLightSensor: true), + userPreferencesService: mockUserPreferencesService, + caffeineService: mockCaffeineService, + hapticsService: mockHapticsService, + permissionsService: mockPermissionsService, + lightSensorService: mockLightSensorService, + volumeEventsService: mockVolumeEventsService, + child: const UserPreferencesProvider( + child: Application(), + ), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + } + + /// Generates several screenshots with the light theme + /// and the additionally the first one with the dark theme + void generateScreenshots(Color color) { + testWidgets('${color.value}_light', (tester) async { + when(() => mockUserPreferencesService.themeType).thenReturn(ThemeType.light); + when(() => mockUserPreferencesService.primaryColor).thenReturn(color); + await pumpApplication(tester); + + await tester.takePhoto(); + await tester.takeScreenshot(binding, '${color.value}_metering_reflected'); + + await tester.tap(find.byTooltip(S.current.tooltipUseLightSensor)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(MeteringMeasureButton)); + await tester.tap(find.byType(MeteringMeasureButton)); + await tester.takeScreenshot(binding, '${color.value}_metering_incident'); + + expect(find.byType(IsoValuePicker), findsOneWidget); + await tester.tap(find.byType(IsoValuePicker)); + await tester.pumpAndSettle(Dimens.durationL); + expect(find.byType(DialogPicker), findsOneWidget); + await tester.takeScreenshot(binding, '${color.value}_metering_iso_picker'); + + await tester.tapCancelButton(); + expect(find.byType(DialogPicker), findsNothing); + expect(find.byTooltip(S.current.tooltipOpenSettings), findsOneWidget); + await tester.tap(find.byTooltip(S.current.tooltipOpenSettings)); + await tester.pumpAndSettle(); + expect(find.byType(SettingsScreen), findsOneWidget); + await tester.takeScreenshot(binding, '${color.value}_settings'); + + await tester.tapListTile(S.current.meteringScreenLayout); + await tester.takeScreenshot(binding, '${color.value}_settings_metering_screen_layout'); + + await tester.tapCancelButton(); + await tester.tapListTile(S.current.equipmentProfiles); + expect(find.byType(EquipmentProfilesScreen), findsOneWidget); + await tester.tap(find.byType(EquipmentProfileContainer).first); + await tester.pumpAndSettle(); + await tester.takeScreenshot(binding, '${color.value}-equipment_profiles'); + + await tester.tap(find.byIcon(Icons.iso).first); + await tester.pumpAndSettle(); + await tester.takeScreenshot(binding, '${color.value}_equipment_profiles_iso_picker'); + }); + + testWidgets( + '${color.value}_dark', + (tester) async { + when(() => mockUserPreferencesService.themeType).thenReturn(ThemeType.dark); + when(() => mockUserPreferencesService.primaryColor).thenReturn(color); + await pumpApplication(tester); + + await tester.takePhoto(); + await tester.takeScreenshot(binding, '${color.value}_metering_reflected_dark'); + + await tester.tap(find.byTooltip(S.current.tooltipUseLightSensor)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(MeteringMeasureButton)); + await tester.tap(find.byType(MeteringMeasureButton)); + await tester.takeScreenshot(binding, '${color.value}_metering_incident_dark'); + }, + ); + } + + generateScreenshots(primaryColorsList[5]); + generateScreenshots(primaryColorsList[3]); + generateScreenshots(primaryColorsList[9]); +} + +extension on WidgetTester { + Future takeScreenshot(IntegrationTestWidgetsFlutterBinding binding, String name) async { + if (Platform.isAndroid) { + await binding.convertFlutterSurfaceToImage(); + await pumpAndSettle(); + } + await binding.takeScreenshot(name); + await pumpAndSettle(); + } + + Future takePhoto() async { + await tap(find.byType(MeteringMeasureButton)); + await pump(const Duration(seconds: 2)); // wait for circular progress indicator + await pump(const Duration(seconds: 1)); // wait for circular progress indicator + await pumpAndSettle(); + } + + Future tapCancelButton() async { + final cancelButton = find.byWidgetPredicate( + (widget) => + widget is TextButton && + widget.child is Text && + (widget.child as Text?)?.data == S.current.cancel, + ); + expect(cancelButton, findsOneWidget); + await tap(cancelButton); + await pumpAndSettle(); + } + + Future tapListTile(String title) async { + final listTile = find.byWidgetPredicate( + (widget) => + widget is ListTile && widget.title is Text && (widget.title as Text?)?.data == title, + ); + expect(listTile, findsOneWidget); + await tap(listTile); + await pumpAndSettle(); + } +} + +final _mockEquipmentProfiles = [ + const EquipmentProfile( + id: '', + name: '', + apertureValues: ApertureValue.values, + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values, + isoValues: IsoValue.values, + ), + EquipmentProfile( + id: '1', + name: 'Praktica + Zenitar', + apertureValues: ApertureValue.values.sublist( + ApertureValue.values.indexOf(const ApertureValue(1.7, StopType.half)), + ApertureValue.values.indexOf(const ApertureValue(16, StopType.full)), + ), + ndValues: NdValue.values.sublist(0, 3), + shutterSpeedValues: ShutterSpeedValue.values.sublist( + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)), + ), + isoValues: const [ + IsoValue(50, StopType.full), + IsoValue(100, StopType.full), + IsoValue(200, StopType.full), + IsoValue(250, StopType.third), + IsoValue(400, StopType.full), + IsoValue(500, StopType.third), + IsoValue(800, StopType.full), + IsoValue(1600, StopType.full), + IsoValue(3200, StopType.full), + ], + ), + const EquipmentProfile( + id: '2', + name: 'Praktica + Jupiter', + apertureValues: ApertureValue.values, + ndValues: NdValue.values, + shutterSpeedValues: ShutterSpeedValue.values, + isoValues: IsoValue.values, + ), +]; diff --git a/integration_test/generate_screenshots.sh b/integration_test/generate_screenshots.sh new file mode 100644 index 0000000..8296e96 --- /dev/null +++ b/integration_test/generate_screenshots.sh @@ -0,0 +1,10 @@ +flutter drive \ + --dart-define="cameraPreviewAspectRatio=240/320" \ + --dart-define="cameraStubImage=assets/camera_stub_image.jpg" \ + --driver=test_driver/screenshot_driver.dart \ + --target=integration_test/generate_screenshots.dart \ + --profile \ + --flavor=dev \ + --no-dds \ + --endless-trace-buffer \ + --purge-persistent-cache diff --git a/lib/application.dart b/lib/application.dart index 38ef0bf..68dd44a 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -1,97 +1,48 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:lightmeter/data/caffeine_service.dart'; -import 'package:lightmeter/data/haptics_service.dart'; -import 'package:lightmeter/data/light_sensor_service.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; -import 'package:lightmeter/data/permissions_service.dart'; -import 'package:lightmeter/data/shared_prefs_service.dart'; -import 'package:lightmeter/data/volume_events_service.dart'; -import 'package:lightmeter/environment.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/services_provider.dart'; import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/screens/metering/flow_metering.dart'; import 'package:lightmeter/screens/settings/flow_settings.dart'; -import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; -import 'package:platform/platform.dart'; -import 'package:shared_preferences/shared_preferences.dart'; class Application extends StatelessWidget { - final Environment env; - - const Application(this.env, {super.key}); + const Application({super.key}); @override Widget build(BuildContext context) { - return FutureBuilder( - future: Future.wait([ - SharedPreferences.getInstance(), - const LightSensorService(LocalPlatform()).hasSensor(), - ]), - builder: (_, snapshot) { - if (snapshot.data != null) { - return IAPProviders( - sharedPreferences: snapshot.data![0] as SharedPreferences, - child: ServicesProvider( - caffeineService: const CaffeineService(), - environment: env.copyWith(hasLightSensor: snapshot.data![1] as bool), - hapticsService: const HapticsService(), - lightSensorService: const LightSensorService(LocalPlatform()), - permissionsService: const PermissionsService(), - userPreferencesService: - UserPreferencesService(snapshot.data![0] as SharedPreferences), - volumeEventsService: const VolumeEventsService(LocalPlatform()), - child: UserPreferencesProvider( - child: Builder( - builder: (context) { - final theme = UserPreferencesProvider.themeOf(context); - final systemIconsBrightness = - ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); - return AnnotatedRegion( - value: SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: systemIconsBrightness == Brightness.light - ? Brightness.dark - : Brightness.light, - statusBarIconBrightness: systemIconsBrightness, - systemNavigationBarColor: Colors.transparent, - systemNavigationBarIconBrightness: systemIconsBrightness, - ), - child: MaterialApp( - theme: theme, - locale: Locale(UserPreferencesProvider.localeOf(context).intlName), - 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!, - ), - initialRoute: "metering", - routes: { - "metering": (context) => const MeteringFlow(), - "settings": (context) => const SettingsFlow(), - }, - ), - ); - }, - ), - ), - ), - ); - } else if (snapshot.error != null) { - return Center(child: Text(snapshot.error!.toString())); - } - - // TODO(@vodemn): maybe user splashscreen instead - return const SizedBox(); - }, + final theme = UserPreferencesProvider.themeOf(context); + final systemIconsBrightness = ThemeData.estimateBrightnessForColor(theme.colorScheme.onSurface); + return AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: + systemIconsBrightness == Brightness.light ? Brightness.dark : Brightness.light, + statusBarIconBrightness: systemIconsBrightness, + systemNavigationBarColor: Colors.transparent, + systemNavigationBarIconBrightness: systemIconsBrightness, + ), + child: MaterialApp( + theme: theme, + locale: Locale(UserPreferencesProvider.localeOf(context).intlName), + 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!, + ), + initialRoute: "metering", + routes: { + "metering": (context) => const MeteringFlow(), + "settings": (context) => const SettingsFlow(), + }, + ), ); } } diff --git a/lib/application_wrapper.dart b/lib/application_wrapper.dart new file mode 100644 index 0000000..f8627f9 --- /dev/null +++ b/lib/application_wrapper.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/data/caffeine_service.dart'; +import 'package:lightmeter/data/haptics_service.dart'; +import 'package:lightmeter/data/light_sensor_service.dart'; +import 'package:lightmeter/data/permissions_service.dart'; +import 'package:lightmeter/data/shared_prefs_service.dart'; +import 'package:lightmeter/data/volume_events_service.dart'; +import 'package:lightmeter/environment.dart'; +import 'package:lightmeter/providers/services_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; +import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; +import 'package:platform/platform.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ApplicationWrapper extends StatelessWidget { + final Environment env; + final Widget child; + + const ApplicationWrapper(this.env, {required this.child, super.key}); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: Future.wait([ + SharedPreferences.getInstance(), + const LightSensorService(LocalPlatform()).hasSensor(), + ]), + builder: (_, snapshot) { + if (snapshot.data != null) { + return IAPProviders( + sharedPreferences: snapshot.data![0] as SharedPreferences, + child: ServicesProvider( + caffeineService: const CaffeineService(), + environment: env.copyWith(hasLightSensor: snapshot.data![1] as bool), + hapticsService: const HapticsService(), + lightSensorService: const LightSensorService(LocalPlatform()), + permissionsService: const PermissionsService(), + userPreferencesService: + UserPreferencesService(snapshot.data![0] as SharedPreferences), + volumeEventsService: const VolumeEventsService(LocalPlatform()), + child: UserPreferencesProvider( + child: child, + ), + ), + ); + } else if (snapshot.error != null) { + return Center(child: Text(snapshot.error!.toString())); + } + + // TODO(@vodemn): maybe user splashscreen instead + return const SizedBox(); + }, + ); + } +} diff --git a/lib/main_dev.dart b/lib/main_dev.dart index fd6ed56..9ef3faf 100644 --- a/lib/main_dev.dart +++ b/lib/main_dev.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/application.dart'; +import 'package:lightmeter/application_wrapper.dart'; import 'package:lightmeter/environment.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - runApp(const Application(Environment.dev())); + runApp(const ApplicationWrapper(Environment.dev(), child: Application())); } diff --git a/lib/main_prod.dart b/lib/main_prod.dart index 2ccc397..b75513e 100644 --- a/lib/main_prod.dart +++ b/lib/main_prod.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/application.dart'; +import 'package:lightmeter/application_wrapper.dart'; import 'package:lightmeter/environment.dart'; import 'package:lightmeter/firebase.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await initializeFirebase(handleErrors: true); - runApp(const Application(Environment.prod())); + runApp(const ApplicationWrapper(Environment.prod(), child: Application())); } diff --git a/lib/main_release.dart b/lib/main_release.dart index b87dff8..bb6384a 100644 --- a/lib/main_release.dart +++ b/lib/main_release.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/application.dart'; +import 'package:lightmeter/application_wrapper.dart'; import 'package:lightmeter/environment.dart'; import 'package:lightmeter/firebase.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await initializeFirebase(handleErrors: false); - runApp(const Application(Environment.prod())); + runApp(const ApplicationWrapper(Environment.prod(), child: Application())); } diff --git a/lib/platform_config.dart b/lib/platform_config.dart index 7d98a4b..def5a80 100644 --- a/lib/platform_config.dart +++ b/lib/platform_config.dart @@ -5,4 +5,6 @@ class PlatformConfig { final rational = const String.fromEnvironment('cameraPreviewAspectRatio').split('/'); return int.parse(rational[0]) / int.parse(rational[1]); } + + static String get cameraStubImage => const String.fromEnvironment('cameraStubImage'); } diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index 0313391..1d7d4b5 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -2,13 +2,14 @@ import 'dart:async'; import 'dart:developer'; import 'dart:io'; import 'dart:math' as math; -import 'dart:typed_data'; import 'package:camera/camera.dart'; import 'package:exif/exif.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/interactors/metering_interactor.dart'; +import 'package:lightmeter/platform_config.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' as communication_event; @@ -32,7 +33,7 @@ class CameraContainerBloc extends EvSourceBlocBase !(_cameraController == null || - !_cameraController!.value.isInitialized || - _cameraController!.value.isTakingPicture); + bool get _canTakePhoto => + PlatformConfig.cameraStubImage.isNotEmpty || + !(_cameraController == null || + !_cameraController!.value.isInitialized || + _cameraController!.value.isTakingPicture); Future _takePhoto() async { try { // https://github.com/flutter/flutter/issues/84957#issuecomment-1661155095 - await _cameraController!.setFocusMode(FocusMode.locked); - await _cameraController!.setExposureMode(ExposureMode.locked); - final file = await _cameraController!.takePicture(); - await _cameraController!.setFocusMode(FocusMode.auto); - await _cameraController!.setExposureMode(ExposureMode.auto); - final Uint8List bytes = await file.readAsBytes(); - Directory(file.path).deleteSync(recursive: true); + late final Uint8List bytes; + if (PlatformConfig.cameraStubImage.isNotEmpty) { + bytes = (await rootBundle.load(PlatformConfig.cameraStubImage)).buffer.asUint8List(); + } else { + await _cameraController!.setFocusMode(FocusMode.locked); + await _cameraController!.setExposureMode(ExposureMode.locked); + final file = await _cameraController!.takePicture(); + await _cameraController!.setFocusMode(FocusMode.auto); + await _cameraController!.setExposureMode(ExposureMode.auto); + bytes = await file.readAsBytes(); + Directory(file.path).deleteSync(recursive: true); + } final tags = await readExifFromBytes(bytes); final iso = double.tryParse("${tags["EXIF ISOSpeedRatings"]}"); diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart index 1ae0ca9..3e9538f 100644 --- a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart @@ -69,6 +69,9 @@ class _CameraPreviewBuilderState extends State<_CameraPreviewBuilder> { @override Widget build(BuildContext context) { + if (PlatformConfig.cameraStubImage.isNotEmpty) { + return Image.asset(PlatformConfig.cameraStubImage); + } return ValueListenableBuilder( valueListenable: _initializedNotifier, builder: (context, value, child) => value diff --git a/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart index af2b35d..76cd729 100644 --- a/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart +++ b/lib/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart @@ -34,6 +34,26 @@ class _DialogFilterState extends State> { bool get _hasAnySelected => checkboxValues.contains(true); bool get _hasAnyUnselected => checkboxValues.contains(false); + late final ScrollController _scrollController; + + @override + void initState() { + super.initState(); + int i = 0; + for (; i < checkboxValues.length; i++) { + if (checkboxValues[i]) { + break; + } + } + _scrollController = ScrollController(initialScrollOffset: Dimens.grid56 * i); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return AlertDialog( @@ -50,6 +70,7 @@ class _DialogFilterState extends State> { const Divider(), Expanded( child: SingleChildScrollView( + controller: _scrollController, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min, diff --git a/pubspec.yaml b/pubspec.yaml index 5454e81..090b8ce 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,12 +48,16 @@ dev_dependencies: flutter_test: sdk: flutter google_fonts: 3.0.1 + integration_test: + sdk: flutter lint: 2.1.2 mocktail: 0.3.0 test: 1.24.1 flutter: uses-material-design: true + assets: + - assets/camera_stub_image.jpg flutter_intl: enabled: true diff --git a/test_driver/screenshot_driver.dart b/test_driver/screenshot_driver.dart new file mode 100644 index 0000000..3b11ee3 --- /dev/null +++ b/test_driver/screenshot_driver.dart @@ -0,0 +1,42 @@ +import 'dart:developer'; +import 'dart:io'; +import 'package:integration_test/integration_test_driver_extended.dart'; + +Future main() async { + try { + final bool adbExists = Process.runSync('which', ['adb']).exitCode == 0; + if (!adbExists) { + log(r'This test needs ADB to exist on the $PATH. Skipping...'); + exit(0); + } + final deviceId = await Process.run('adb', ["-s", 'shell', 'devices']).then((value) { + if (value.stdout is String) { + return RegExp(r"(?:List of devices attached\n)([A-Z0-9]*)(?:\sdevice\n)") + .firstMatch(value.stdout as String)! + .group(1); + } + }); + if (deviceId == null) { + log('This test needs at least one device connected'); + exit(0); + } + await Process.run('adb', [ + "-s", + deviceId, // https://github.com/flutter/flutter/issues/86295#issuecomment-1192766368 + 'shell', + 'pm', + 'grant', + 'com.vodemn.lightmeter.dev', + 'android.permission.CAMERA' + ]); + await integrationDriver( + onScreenshot: (name, bytes, [args]) async { + final File image = await File('screenshots/$name.png').create(recursive: true); + image.writeAsBytesSync(bytes); + return true; + }, + ); + } catch (e) { + log('Error occured: $e'); + } +} From 0b51db642c51cdd5e71758042af2877dc7edde3a Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Fri, 29 Sep 2023 12:45:39 +0200 Subject: [PATCH 49/49] ML-126 Automate screenshots creation (#128) * generate screenshots with ep set to None --- integration_test/generate_screenshots.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration_test/generate_screenshots.dart b/integration_test/generate_screenshots.dart index 510c7fb..2c28d42 100644 --- a/integration_test/generate_screenshots.dart +++ b/integration_test/generate_screenshots.dart @@ -115,7 +115,7 @@ void main() { IAPProviders( sharedPreferences: _MockSharedPreferences(), child: EquipmentProfiles( - selected: _mockEquipmentProfiles[1], + selected: _mockEquipmentProfiles[0], values: _mockEquipmentProfiles, child: Films( selected: const Film('Ilford HP5+', 400), @@ -264,12 +264,12 @@ final _mockEquipmentProfiles = [ name: 'Praktica + Zenitar', apertureValues: ApertureValue.values.sublist( ApertureValue.values.indexOf(const ApertureValue(1.7, StopType.half)), - ApertureValue.values.indexOf(const ApertureValue(16, StopType.full)), + ApertureValue.values.indexOf(const ApertureValue(16, StopType.full)) + 1, ), ndValues: NdValue.values.sublist(0, 3), shutterSpeedValues: ShutterSpeedValue.values.sublist( ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), - ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)), + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)) + 1, ), isoValues: const [ IsoValue(50, StopType.full),

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φlvic**>ntPiit;TvVQf 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