mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-23 16:00:41 +00:00
wip
This commit is contained in:
parent
179008ff77
commit
8c9f3d98f7
11 changed files with 98 additions and 45 deletions
|
@ -6,6 +6,7 @@ import 'package:lightmeter/data/models/ev_source_type.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import 'data/light_sensor_service.dart';
|
||||||
import 'data/permissions_service.dart';
|
import 'data/permissions_service.dart';
|
||||||
import 'data/shared_prefs_service.dart';
|
import 'data/shared_prefs_service.dart';
|
||||||
import 'environment.dart';
|
import 'environment.dart';
|
||||||
|
@ -35,6 +36,7 @@ class Application extends StatelessWidget {
|
||||||
Provider(create: (_) => UserPreferencesService(snapshot.data!)),
|
Provider(create: (_) => UserPreferencesService(snapshot.data!)),
|
||||||
Provider(create: (_) => const HapticsService()),
|
Provider(create: (_) => const HapticsService()),
|
||||||
Provider(create: (_) => PermissionsService()),
|
Provider(create: (_) => PermissionsService()),
|
||||||
|
Provider(create: (_) => const LightSensorService()),
|
||||||
],
|
],
|
||||||
child: StopTypeProvider(
|
child: StopTypeProvider(
|
||||||
child: ThemeProvider(
|
child: ThemeProvider(
|
||||||
|
|
9
lib/data/light_sensor_service.dart
Normal file
9
lib/data/light_sensor_service.dart
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import 'package:light_sensor/light_sensor.dart';
|
||||||
|
|
||||||
|
class LightSensorService {
|
||||||
|
const LightSensorService();
|
||||||
|
|
||||||
|
Future<bool> hasSensor() async => await LightSensor.hasSensor ?? false;
|
||||||
|
|
||||||
|
Stream<int> luxStream() => LightSensor.lightSensorStream;
|
||||||
|
}
|
|
@ -1,13 +1,18 @@
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:lightmeter/data/haptics_service.dart';
|
import 'package:lightmeter/data/haptics_service.dart';
|
||||||
|
import 'package:lightmeter/data/light_sensor_service.dart';
|
||||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
|
|
||||||
class MeteringInteractor {
|
class MeteringInteractor {
|
||||||
final UserPreferencesService _userPreferencesService;
|
final UserPreferencesService _userPreferencesService;
|
||||||
final HapticsService _hapticsService;
|
final HapticsService _hapticsService;
|
||||||
|
final LightSensorService _lightSensorService;
|
||||||
|
|
||||||
const MeteringInteractor(
|
const MeteringInteractor(
|
||||||
this._userPreferencesService,
|
this._userPreferencesService,
|
||||||
this._hapticsService,
|
this._hapticsService,
|
||||||
|
this._lightSensorService,
|
||||||
);
|
);
|
||||||
|
|
||||||
double get cameraEvCalibration => _userPreferencesService.cameraEvCalibration;
|
double get cameraEvCalibration => _userPreferencesService.cameraEvCalibration;
|
||||||
|
@ -25,4 +30,14 @@ class MeteringInteractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
void enableHaptics(bool enable) => _userPreferencesService.haptics = enable;
|
void enableHaptics(bool enable) => _userPreferencesService.haptics = enable;
|
||||||
|
|
||||||
|
Future<bool> hasAmbientLightSensor() async {
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
return _lightSensorService.hasSensor();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<int> luxStream() => _lightSensorService.luxStream();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/ev_source/ev_source_bloc.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/communication/state_communication_metering.dart'
|
||||||
|
as communication_states;
|
||||||
|
import 'package:lightmeter/utils/log_2.dart';
|
||||||
|
|
||||||
|
import 'event_light_sensor.dart';
|
||||||
|
import 'state_light_sensor.dart';
|
||||||
|
|
||||||
|
class LightSensorBloc extends EvSourceBloc<LightSensorEvent, LightSensorState> {
|
||||||
|
final MeteringInteractor _meteringInteractor;
|
||||||
|
|
||||||
|
StreamSubscription<int>? _luxSubscriptions;
|
||||||
|
|
||||||
|
LightSensorBloc(
|
||||||
|
MeteringCommunicationBloc communicationBloc,
|
||||||
|
this._meteringInteractor,
|
||||||
|
) : super(
|
||||||
|
communicationBloc,
|
||||||
|
const LightSensorInitState(),
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onCommunicationState(communication_states.SourceState communicationState) {
|
||||||
|
if (communicationState is communication_states.MeasureState) {
|
||||||
|
if (_luxSubscriptions == null) {
|
||||||
|
_luxSubscriptions = _meteringInteractor.luxStream().listen((event) {
|
||||||
|
communicationBloc.add(communication_event.MeasuredEvent(log2(event.toDouble() / 2.5)));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
_luxSubscriptions?.cancel().then((_) => _luxSubscriptions = null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> close() async {
|
||||||
|
_luxSubscriptions?.cancel().then((_) => _luxSubscriptions = null);
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
abstract class LightSensorEvent {
|
||||||
|
const LightSensorEvent();
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
abstract class LightSensorState {
|
||||||
|
const LightSensorState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class LightSensorInitState extends LightSensorState {
|
||||||
|
const LightSensorInitState();
|
||||||
|
}
|
|
@ -1,27 +0,0 @@
|
||||||
import 'dart:math';
|
|
||||||
import 'package:lightmeter/screens/metering/ev_source/ev_source_bloc.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/communication/state_communication_metering.dart'
|
|
||||||
as communication_states;
|
|
||||||
|
|
||||||
import 'event_random_ev.dart';
|
|
||||||
import 'state_random_ev.dart';
|
|
||||||
|
|
||||||
class RandomEvBloc extends EvSourceBloc<RandomEvEvent, RandomEvState> {
|
|
||||||
final random = Random();
|
|
||||||
|
|
||||||
RandomEvBloc(MeteringCommunicationBloc communicationBloc)
|
|
||||||
: super(
|
|
||||||
communicationBloc,
|
|
||||||
RandomEvState(Random().nextDouble() * 15),
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void onCommunicationState(communication_states.SourceState communicationState) {
|
|
||||||
if (communicationState is communication_states.MeasureState) {
|
|
||||||
communicationBloc.add(communication_event.MeasuredEvent(random.nextDouble() * 15));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
abstract class RandomEvEvent {
|
|
||||||
const RandomEvEvent();
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
class RandomEvState {
|
|
||||||
final double ev;
|
|
||||||
|
|
||||||
const RandomEvState(this.ev);
|
|
||||||
}
|
|
|
@ -1,14 +1,15 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/data/haptics_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/ev_source_type.dart';
|
||||||
import 'package:lightmeter/data/models/photography_values/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_values/photography_value.dart';
|
||||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/ev_source/light_sensor/bloc_light_sensor.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'ev_source/camera/bloc_camera.dart';
|
import 'ev_source/camera/bloc_camera.dart';
|
||||||
import 'ev_source/random_ev/bloc_random_ev.dart';
|
|
||||||
import 'bloc_metering.dart';
|
import 'bloc_metering.dart';
|
||||||
import 'communication/bloc_communication_metering.dart';
|
import 'communication/bloc_communication_metering.dart';
|
||||||
import 'screen_metering.dart';
|
import 'screen_metering.dart';
|
||||||
|
@ -18,10 +19,12 @@ class MeteringFlow extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final sourceType = context.watch<EvSourceType>();
|
||||||
return Provider(
|
return Provider(
|
||||||
create: (context) => MeteringInteractor(
|
create: (context) => MeteringInteractor(
|
||||||
context.read<UserPreferencesService>(),
|
context.read<UserPreferencesService>(),
|
||||||
context.read<HapticsService>(),
|
context.read<HapticsService>(),
|
||||||
|
context.read<LightSensorService>(),
|
||||||
),
|
),
|
||||||
child: MultiBlocProvider(
|
child: MultiBlocProvider(
|
||||||
providers: [
|
providers: [
|
||||||
|
@ -34,16 +37,19 @@ class MeteringFlow extends StatelessWidget {
|
||||||
context.read<StopType>(),
|
context.read<StopType>(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
BlocProvider(
|
if (sourceType == EvSourceType.camera)
|
||||||
create: (context) => CameraBloc(
|
|
||||||
context.read<MeteringCommunicationBloc>(),
|
|
||||||
context.read<MeteringInteractor>(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (context.read<EvSourceType>() == EvSourceType.sensor)
|
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
lazy: false,
|
create: (context) => CameraBloc(
|
||||||
create: (context) => RandomEvBloc(context.read<MeteringCommunicationBloc>()),
|
context.read<MeteringCommunicationBloc>(),
|
||||||
|
context.read<MeteringInteractor>(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (sourceType == EvSourceType.sensor)
|
||||||
|
BlocProvider(
|
||||||
|
create: (context) => LightSensorBloc(
|
||||||
|
context.read<MeteringCommunicationBloc>(),
|
||||||
|
context.read<MeteringInteractor>(),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: const MeteringScreen(),
|
child: const MeteringScreen(),
|
||||||
|
|
|
@ -17,6 +17,7 @@ dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
intl: 0.17.0
|
intl: 0.17.0
|
||||||
intl_utils: 2.8.1
|
intl_utils: 2.8.1
|
||||||
|
light_sensor: 2.0.2
|
||||||
material_color_utilities: 0.2.0
|
material_color_utilities: 0.2.0
|
||||||
package_info_plus: 3.0.2
|
package_info_plus: 3.0.2
|
||||||
permission_handler: 10.2.0
|
permission_handler: 10.2.0
|
||||||
|
|
Loading…
Reference in a new issue