From 9cece036d16eff3527a611719065013f1486e8f5 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Thu, 28 Aug 2025 16:35:15 +0200 Subject: [PATCH 1/2] ML-262 Update to a newer version of Google Play Billing Library (#266) * add billing permission * remove billing library --- android/app/build.gradle | 1 - android/app/src/main/AndroidManifest.xml | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ce5fbfa..56e26f1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,6 +106,5 @@ flutter { } dependencies { - implementation "com.android.billingclient:billing-ktx:6.0.0" implementation "com.google.firebase:firebase-analytics:17.4.1" } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5d3d43c..75ac782 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -53,4 +53,6 @@ + + \ No newline at end of file From 78f4bf96ceba9cb1082e1f97e340470ec976d7d2 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:27:52 +0200 Subject: [PATCH 2/2] ML-260 Set ISO when selecting a film (#267) * set ISO according to film * remove unnecessary equipment profile listeners * Update e2e_test.dart --- integration_test/e2e_test.dart | 2 +- .../widget_picker_equipment_profiles.dart | 22 ++------------ lib/screens/metering/screen_metering.dart | 18 ++++++++++- .../metering/utils/listener_films.dart | 30 +++++++++++++++++++ 4 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 lib/screens/metering/utils/listener_films.dart diff --git a/integration_test/e2e_test.dart b/integration_test/e2e_test.dart index fc2cfc0..97022f1 100644 --- a/integration_test/e2e_test.dart +++ b/integration_test/e2e_test.dart @@ -136,8 +136,8 @@ void testE2E(String description) { ); /// Set another film and another ISO - await tester.openPickerAndSelect('200'); await tester.openPickerAndSelect(mockFilms[1].name); + await tester.openPickerAndSelect('200'); await _expectMeteringStateAndMeasure( tester, equipmentProfile: mockEquipmentProfiles[1], 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 index 1701282..65a73b5 100644 --- 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 @@ -1,28 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; -import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; -import 'package:lightmeter/screens/metering/communication/event_communication_metering.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 EquipmentProfilePicker extends StatefulWidget { +class EquipmentProfilePicker extends StatelessWidget { const EquipmentProfilePicker(); - @override - State createState() => _EquipmentProfilePickerState(); -} - -class _EquipmentProfilePickerState extends State { - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final profile = EquipmentProfiles.selectedOf(context); - context.read().add(EquipmentProfileChangedEvent(profile)); - } - @override Widget build(BuildContext context) { return AnimatedDialogPicker( @@ -31,10 +16,7 @@ class _EquipmentProfilePickerState extends State { selectedValue: EquipmentProfiles.selectedOf(context), values: EquipmentProfiles.inUseOf(context), itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name), - onChanged: (profile) { - EquipmentProfilesProvider.of(context).selectProfile(profile); - context.read().add(EquipmentProfileChangedEvent(profile)); - }, + onChanged: EquipmentProfilesProvider.of(context).selectProfile, closedChild: ReadingValueContainer.singleValue( value: ReadingValue( label: S.of(context).equipmentProfile, diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 417d330..4f81e4a 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; @@ -9,12 +10,15 @@ 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/communication/bloc_communication_metering.dart'; +import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' as communication_event; import 'package:lightmeter/screens/metering/components/bottom_controls/widget_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/screens/metering/utils/listener_equipment_profiles.dart'; +import 'package:lightmeter/screens/metering/utils/listener_films.dart'; import 'package:lightmeter/screens/timer/flow_timer.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; @@ -91,8 +95,20 @@ class _InheritedListeners extends StatelessWidget { return EquipmentProfileListener( onDidChangeDependencies: (value) { context.read().add(EquipmentProfileChangedEvent(value)); + context.read().add(communication_event.EquipmentProfileChangedEvent(value)); }, - child: child, + child: FilmListener( + onDidChangeDependencies: (value) { + /// Do nothing if no film selected + if (value != const FilmStub()) { + final isoValue = IsoValue.values.firstWhereOrNull((e) => e.rawValue == value.iso); + if (isoValue case final isoValue?) { + context.read().add(IsoChangedEvent(isoValue)); + } + } + }, + child: child, + ), ); } } diff --git a/lib/screens/metering/utils/listener_films.dart b/lib/screens/metering/utils/listener_films.dart new file mode 100644 index 0000000..a9c6e8d --- /dev/null +++ b/lib/screens/metering/utils/listener_films.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:lightmeter/providers/films_provider.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class FilmListener extends StatefulWidget { + final ValueChanged onDidChangeDependencies; + final Widget child; + + const FilmListener({ + required this.onDidChangeDependencies, + required this.child, + super.key, + }); + + @override + State createState() => _FilmListenerState(); +} + +class _FilmListenerState extends State { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + widget.onDidChangeDependencies(Films.selectedOf(context)); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } +}