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;
+ }
+}