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:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'data/light_sensor_service.dart';
|
||||
import 'data/permissions_service.dart';
|
||||
import 'data/shared_prefs_service.dart';
|
||||
import 'environment.dart';
|
||||
|
@ -35,6 +36,7 @@ class Application extends StatelessWidget {
|
|||
Provider(create: (_) => UserPreferencesService(snapshot.data!)),
|
||||
Provider(create: (_) => const HapticsService()),
|
||||
Provider(create: (_) => PermissionsService()),
|
||||
Provider(create: (_) => const LightSensorService()),
|
||||
],
|
||||
child: StopTypeProvider(
|
||||
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/light_sensor_service.dart';
|
||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||
|
||||
class MeteringInteractor {
|
||||
final UserPreferencesService _userPreferencesService;
|
||||
final HapticsService _hapticsService;
|
||||
final LightSensorService _lightSensorService;
|
||||
|
||||
const MeteringInteractor(
|
||||
this._userPreferencesService,
|
||||
this._hapticsService,
|
||||
this._lightSensorService,
|
||||
);
|
||||
|
||||
double get cameraEvCalibration => _userPreferencesService.cameraEvCalibration;
|
||||
|
@ -25,4 +30,14 @@ class MeteringInteractor {
|
|||
}
|
||||
|
||||
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_bloc/flutter_bloc.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/photography_values/photography_value.dart';
|
||||
import 'package:lightmeter/data/shared_prefs_service.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 'ev_source/camera/bloc_camera.dart';
|
||||
import 'ev_source/random_ev/bloc_random_ev.dart';
|
||||
import 'bloc_metering.dart';
|
||||
import 'communication/bloc_communication_metering.dart';
|
||||
import 'screen_metering.dart';
|
||||
|
@ -18,10 +19,12 @@ class MeteringFlow extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final sourceType = context.watch<EvSourceType>();
|
||||
return Provider(
|
||||
create: (context) => MeteringInteractor(
|
||||
context.read<UserPreferencesService>(),
|
||||
context.read<HapticsService>(),
|
||||
context.read<LightSensorService>(),
|
||||
),
|
||||
child: MultiBlocProvider(
|
||||
providers: [
|
||||
|
@ -34,16 +37,19 @@ class MeteringFlow extends StatelessWidget {
|
|||
context.read<StopType>(),
|
||||
),
|
||||
),
|
||||
BlocProvider(
|
||||
create: (context) => CameraBloc(
|
||||
context.read<MeteringCommunicationBloc>(),
|
||||
context.read<MeteringInteractor>(),
|
||||
),
|
||||
),
|
||||
if (context.read<EvSourceType>() == EvSourceType.sensor)
|
||||
if (sourceType == EvSourceType.camera)
|
||||
BlocProvider(
|
||||
lazy: false,
|
||||
create: (context) => RandomEvBloc(context.read<MeteringCommunicationBloc>()),
|
||||
create: (context) => CameraBloc(
|
||||
context.read<MeteringCommunicationBloc>(),
|
||||
context.read<MeteringInteractor>(),
|
||||
),
|
||||
),
|
||||
if (sourceType == EvSourceType.sensor)
|
||||
BlocProvider(
|
||||
create: (context) => LightSensorBloc(
|
||||
context.read<MeteringCommunicationBloc>(),
|
||||
context.read<MeteringInteractor>(),
|
||||
),
|
||||
),
|
||||
],
|
||||
child: const MeteringScreen(),
|
||||
|
|
|
@ -17,6 +17,7 @@ dependencies:
|
|||
sdk: flutter
|
||||
intl: 0.17.0
|
||||
intl_utils: 2.8.1
|
||||
light_sensor: 2.0.2
|
||||
material_color_utilities: 0.2.0
|
||||
package_info_plus: 3.0.2
|
||||
permission_handler: 10.2.0
|
||||
|
|
Loading…
Reference in a new issue