diff --git a/assets/pngs/emergency.png b/assets/pngs/emergency.png
new file mode 100644
index 0000000..5a12015
Binary files /dev/null and b/assets/pngs/emergency.png differ
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index e6a0ac0..0f8d01a 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -3,6 +3,8 @@ PODS:
- Flutter
- MTBBarcodeScanner
- SwiftProtobuf
+ - device_info (0.0.1):
+ - Flutter
- easy_app_installer (0.0.1):
- Flutter
- Flutter (1.0.0)
@@ -12,6 +14,8 @@ PODS:
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
+ - location (0.0.1):
+ - Flutter
- modal_progress_hud_nsn (0.0.1):
- Flutter
- MTBBarcodeScanner (5.0.11)
@@ -22,6 +26,8 @@ PODS:
- FlutterMacOS
- permission_handler_apple (9.0.4):
- Flutter
+ - platform_device_id (0.0.1):
+ - Flutter
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
@@ -33,13 +39,16 @@ PODS:
DEPENDENCIES:
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
+ - device_info (from `.symlinks/plugins/device_info/ios`)
- easy_app_installer (from `.symlinks/plugins/easy_app_installer/ios`)
- Flutter (from `Flutter`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
+ - location (from `.symlinks/plugins/location/ios`)
- modal_progress_hud_nsn (from `.symlinks/plugins/modal_progress_hud_nsn/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
+ - platform_device_id (from `.symlinks/plugins/platform_device_id/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
@@ -53,12 +62,16 @@ SPEC REPOS:
EXTERNAL SOURCES:
barcode_scan2:
:path: ".symlinks/plugins/barcode_scan2/ios"
+ device_info:
+ :path: ".symlinks/plugins/device_info/ios"
easy_app_installer:
:path: ".symlinks/plugins/easy_app_installer/ios"
Flutter:
:path: Flutter
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
+ location:
+ :path: ".symlinks/plugins/location/ios"
modal_progress_hud_nsn:
:path: ".symlinks/plugins/modal_progress_hud_nsn/ios"
package_info_plus:
@@ -67,6 +80,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/path_provider_foundation/ios"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
+ platform_device_id:
+ :path: ".symlinks/plugins/platform_device_id/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
sqflite:
@@ -74,16 +89,19 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
+ device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
easy_app_installer: 29abe397da7d86721fee853281202f414373f45c
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
+ location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740
modal_progress_hud_nsn: f6fb744cd060653d66ed8f325360ef3650eb2fde
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
- path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852
+ path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
- shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca
+ platform_device_id: 81b3e2993881f87d0c82ef151dc274df4869aef5
+ shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 097b297..3559a67 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -47,5 +47,14 @@
UIViewControllerBasedStatusBarAppearance
+
+ NSLocationWhenInUseUsageDescription
+ Need location when in use
+ NSLocationAlwaysAndWhenInUseUsageDescription
+ Always and when in use!
+ NSLocationUsageDescription
+ Older devices need location.
+ NSLocationAlwaysUsageDescription
+ Can I have location always?
diff --git a/lib/bloc/sos/sos_bloc.dart b/lib/bloc/sos/sos_bloc.dart
index 03e5341..beb2c0f 100644
--- a/lib/bloc/sos/sos_bloc.dart
+++ b/lib/bloc/sos/sos_bloc.dart
@@ -1,22 +1,106 @@
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
+import 'package:flutter/foundation.dart';
import 'package:location/location.dart';
+import 'package:unit2/model/sos/session.dart';
import 'package:unit2/sevices/sos/sos_service.dart';
+import '../../utils/global.dart';
+
part 'sos_event.dart';
part 'sos_state.dart';
class SosBloc extends Bloc {
SosBloc() : super(SosInitial()) {
LocationData? locationData;
- on((event, emit)async {
- emit(LoadingState());
+ String? mobile1;
+ String? mobile2;
+ String? sessionToken;
+ ////get user location
+ on((event, emit) async {
+ emit(const LoadingState(message: "Getting Location"));
+ mobile1 = await SOS!.get('mobile1');
+ mobile2 = await SOS!.get('mobile2');
+ sessionToken = await SOS!.get('session_token');
+ if (mobile1 != null) {
+ if (sessionToken != null) {
+ add(CheckAcknowledgement(sessionToken: sessionToken!));
+ } else {
+ try {
+ LocationData? newLocationData =
+ await SosService.instance.getUserLocation();
+ locationData = newLocationData;
+ emit(RequestSosState(
+ locationData: locationData!,
+ mobile1: mobile1!,
+ mobile2: mobile2));
+ } catch (e) {
+ emit(ErrorState(message: e.toString()));
+ }
+ }
+ } else {
+ try {
LocationData? newLocationData =
- await SosService.instance.getUserLocation();
- locationData = newLocationData;
- // User location Loaded and there is no mobile numbers in cache
- emit(UserLocationLoaded(locationData: locationData!));
+ await SosService.instance.getUserLocation();
+ locationData = newLocationData;
+
+ emit(UserLocationLoaded(locationData: locationData!));
+ } catch (e) {
+ emit(ErrorState(message: e.toString()));
+ }
+ }
+ });
+ ////submit mobile
+ on((event, emit) async {
+ emit(const LoadingState(message: ""));
+ mobile1 = event.mobile1;
+ mobile2 = event.mobile2;
+ await SOS!.put('mobile1', event.mobile1);
+ await SOS!.put('mobile2', event.mobile2);
+ emit(RequestSosState(
+ locationData: locationData!,
+ mobile1: event.mobile1,
+ mobile2: event.mobile2));
+ });
+
+ //// send SOS
+ on((event, emit) async {
+ SessionData sessionData;
+ emit(const LoadingState(message: "Sending emergency response request"));
+ try {
+ sessionData = await SosService.instance.requestSos(
+ location: locationData!,
+ mobile1: mobile1!,
+ mobile2: mobile2,
+ msg: event.msg,
+ requestedDate: event.requestDate);
+ await SOS!.put('session_token', sessionData.sessionToken);
+ emit(SOSReceivedState(sessionToken: sessionData.sessionToken!));
+ } catch (e) {
+ emit(ErrorState(message: e.toString()));
+ }
+ });
+ //// check acknowledgement
+ on((event, emit) async {
+ SessionData sessionData;
+ try {
+ SessionData? newSessionData =
+ await SosService.instance.checkAcknowledgement(event.sessionToken);
+ if (newSessionData.acknowledgeDate == null) {
+ debugPrint(newSessionData.sessionToken);
+ emit(SOSReceivedState(sessionToken: newSessionData.sessionToken!));
+ } else {
+ sessionData = newSessionData;
+ emit(SoSAcknowledgementConfirm(sessionData: sessionData));
+ }
+ } catch (e) {
+ emit(ErrorState(message: e.toString()));
+ }
+ });
+ on((event, emit) async {
+ await SOS!.delete('session_token');
+ add(LoadUserLocation());
});
}
}
diff --git a/lib/bloc/sos/sos_event.dart b/lib/bloc/sos/sos_event.dart
index 0880459..db341cd 100644
--- a/lib/bloc/sos/sos_event.dart
+++ b/lib/bloc/sos/sos_event.dart
@@ -11,3 +11,33 @@ class LoadUserLocation extends SosEvent {
@override
List