no message

merge-update-with-lab-changes
Zohaib Kambrani 5 years ago
parent 92ba977fca
commit 8457972fda

@ -1 +1 @@
4592a16118bc51c556d89309892cf794 3f3d14a0ae775b56806906c2cb14a1f0

@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project # Uncomment this line to define a global platform for your project
# platform :ios, '11.0' platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency. # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true' ENV['COCOAPODS_DISABLE_STATS'] = 'true'

@ -27,8 +27,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
@ -38,8 +36,8 @@
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions> <Testables>
</AdditionalOptions> </Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
@ -61,8 +59,6 @@
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Profile" buildConfiguration = "Profile"

@ -4,12 +4,14 @@ import GoogleMaps
@UIApplicationMain @UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate {
override func application( override func application( _ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GMSServices.provideAPIKey("AIzaSyCiiJiHkocPbcziHt9O8rGWavDrxHRQys8") GMSServices.provideAPIKey("AIzaSyCiiJiHkocPbcziHt9O8rGWavDrxHRQys8")
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
if let _ = launchOptions?[.location] {
HMG_Geofence().wakeup()
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }
} }

@ -28,8 +28,8 @@ class MainFlutterVC: FlutterViewController {
}else if methodCall.method == "isHMGNetworkAvailable"{ }else if methodCall.method == "isHMGNetworkAvailable"{
self.isHMGNetworkAvailable(methodCall:methodCall, result: result) self.isHMGNetworkAvailable(methodCall:methodCall, result: result)
}else{ }else if methodCall.method == "registerHmgGeofences"{
self.registerHmgGeofences(result: result)
} }
print("") print("")
@ -89,18 +89,6 @@ class MainFlutterVC: FlutterViewController {
} }
} }
} }
// [NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
// if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
// for (NEHotspotNetwork* network in cmd.networkList) {
// NSLog(@"network.SSID = %@",network.SSID);
// }
// }
// }];
return false return false
} }
@ -117,16 +105,16 @@ class MainFlutterVC: FlutterViewController {
} }
} }
// Register Geofence
func registerHmgGeofences(result: @escaping FlutterResult){
flutterMethodChannel?.invokeMethod("getGeofencePreferenceKey", arguments: nil){ geoFencesJsonString in
if let jsonString = geoFencesJsonString as? String{
let allZones = GeoZoneModel.list(from: jsonString)
HMG_Geofence().register(geoZones: allZones)
}else{
/* }
// MARK: - Navigation }
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
} }
*/
} }

@ -0,0 +1,47 @@
//
// GeoZoneModel.swift
// Runner
//
// Created by ZiKambrani on 13/12/2020.
//
import UIKit
class GeoZoneModel{
var geofenceId:Int = -1
var description:String = ""
var descriptionN:String?
var latitude:String?
var longitude:String?
var radius:Int?
var type:Int?
var projectID:Int?
var imageURL:String?
var isCity:String?
func identifier() -> String{
return "\(geofenceId)_\(description)"
}
class func from(json:[String:Any]) -> GeoZoneModel{
let model = GeoZoneModel()
model.geofenceId = json["GEOF_ID"] as? Int ?? 0
model.radius = json["Radius"] as? Int
model.projectID = json["ProjectID"] as? Int
model.type = json["Type"] as? Int
model.description = json["Description"] as? String ?? ""
model.descriptionN = json["DescriptionN"] as? String
model.latitude = json["Latitude"] as? String
model.longitude = json["Longitude"] as? String
model.imageURL = json["ImageURL"] as? String
model.isCity = json["IsCity"] as? String
return model
}
class func list(from jsonString:String) -> [GeoZoneModel]{
let value = dictionaryArray(from: jsonString)
let geoZones = value.map { GeoZoneModel.from(json: $0) }
return geoZones
}
}

@ -7,3 +7,47 @@
import UIKit import UIKit
func dictionaryArray(from:String) -> [[String:Any]]{
if let data = from.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] ?? []
} catch {
print(error.localizedDescription)
}
}
return []
}
func httpPostRequest(urlString:String, jsonBody:[String:Any], completion:((Bool,[String:Any]?)->Void)?){
let json: [String: Any] = jsonBody
let jsonData = try? JSONSerialization.data(withJSONObject: json)
// create post request
let url = URL(string: urlString)!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "No data")
return
}
let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
if let responseJSON = responseJSON as? [String: Any], let status = responseJSON["MessageStatus"] as? Int{
print(responseJSON)
if status == 1{
completion?(true,responseJSON)
}else{
completion?(false,responseJSON)
}
}
}
task.resume()
}

@ -0,0 +1,155 @@
//
// HMG_Geofence.swift
// Runner
//
// Created by ZiKambrani on 13/12/2020.
//
import UIKit
import CoreLocation
fileprivate var df = DateFormatter()
fileprivate var transition = ""
enum Transition:Int {
case entry = 1
case exit = 2
}
class HMG_Geofence:NSObject{
var geoZones:[GeoZoneModel]?
var locationManager = CLLocationManager()
func initLocationManager(){
locationManager.delegate = self
locationManager.allowsBackgroundLocationUpdates = true
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.activityType = .other
locationManager.requestAlwaysAuthorization()
}
func register(geoZones:[GeoZoneModel]){
self.geoZones = geoZones
self.geoZones?.forEach({ (zone) in
startMonitoring(zone: zone)
})
}
func wakeup(){
initLocationManager()
}
func monitoredRegions() -> Set<CLRegion>{
return locationManager.monitoredRegions
}
}
// CLLocationManager Delegates
extension HMG_Geofence : CLLocationManagerDelegate{
func startMonitoring(zone: GeoZoneModel) {
if !CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
return
}
if CLLocationManager.authorizationStatus() != .authorizedAlways {
let message = """
Your geotification is saved but will only be activated once you grant
HMG permission to access the device location.
"""
debugPrint(message)
}
if let fenceRegion = region(with: zone){
locationManager.startMonitoring(for: fenceRegion)
locationManager.requestState(for: fenceRegion)
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLCircularRegion {
handleEvent(for: region,transition: .entry, location: manager.location)
}
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
if region is CLCircularRegion {
handleEvent(for: region,transition: .exit, location: manager.location)
}
}
}
// Helpers
extension HMG_Geofence{
func handleEvent(for region: CLRegion!, transition:Transition, location:CLLocation?) {
if let zone = geoZone(by: region.identifier){
notifyUser(forZone: zone, transiotion: transition, location: locationManager.location)
notifyServer(forZone: zone, transiotion: transition, location: locationManager.location)
}
}
func region(with geoZone: GeoZoneModel) -> CLCircularRegion? {
if !geoZone.identifier().isEmpty,
let radius = geoZone.radius, let lat = geoZone.latitude, let long = geoZone.longitude,
let radius_d = Double("\(radius)"), let lat_d = Double(lat), let long_d = Double(long){
let coordinate = CLLocationCoordinate2D(latitude: lat_d, longitude: long_d)
let region = CLCircularRegion(center: coordinate, radius: radius_d, identifier: geoZone.identifier())
region.notifyOnEntry = true
region.notifyOnExit = true
return region
}
return nil
}
func geoZone(by id: String) -> GeoZoneModel? {
return geoZones?.first(where: { $0.identifier() == id})
}
func notifyUser(forZone:GeoZoneModel, transiotion:Transition, location:CLLocation?){
}
func notifyServer(forZone:GeoZoneModel, transiotion:Transition, location:CLLocation?){
flutterMethodChannel?.invokeMethod("getLogGeofenceFullUrl", arguments: nil){ fullUrlString in
if let url = fullUrlString as? String{
let body:[String : Any?] = [
"PointsID":forZone.geofenceId,
"GeoType":transiotion.rawValue,
"PatientID":"1231755",
"ZipCode": "966",
"VersionID": 5.6,
"Channel": 3,
"LanguageID": UserDefaults.standard.string(forKey: "language") ?? "ar",
"IPAdress": "10.20.10.20",
"generalid": "Cs2020@2016$2958",
"PatientOutSA": 0,
"isDentalAllowedBackend": false,
"TokenID": "27v/qqXC/UGS2bgJfRBHYw==",
"DeviceTypeID": 2
]
httpPostRequest(urlString: url, jsonBody: body){ (status,json) in
if let json_ = json , status{
}else{
}
}
}
}
}
}

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSCalendarsUsageDescription</key>
<string>We need access to record you event in to calender.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app will use your location to show cool stuffs near you.</string>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>

@ -4,6 +4,7 @@ class GeoZonesRequestModel {
GeoZonesRequestModel({this.PatientID}); GeoZonesRequestModel({this.PatientID});
Map<String, dynamic> toFlatMap() { Map<String, dynamic> toFlatMap() {
if()
return {"PatientID": PatientID.toString()}; return {"PatientID": PatientID.toString()};
} }
} }

@ -2,11 +2,14 @@ import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/LogGeoZoneRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/geofencing/requests/LogGeoZoneRequestModel.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/responses/GeoZonesResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/geofencing/responses/GeoZonesResponseModel.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/responses/LogGeoZoneResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/geofencing/responses/LogGeoZoneResponseModel.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:flutter/cupertino.dart';
import '../../../locator.dart'; import '../../../locator.dart';
@ -16,9 +19,14 @@ class GeofencingServices extends BaseService {
Future<List<GeoZonesResponseModel>> getAllGeoZones(GeoZonesRequestModel request) async { Future<List<GeoZonesResponseModel>> getAllGeoZones(GeoZonesRequestModel request) async {
hasError = false; hasError = false;
await baseAppClient.post(GET_GEO_ZONES, onSuccess: (dynamic response, int statusCode) { await baseAppClient.post(GET_GEO_ZONES, onSuccess: (dynamic response, int statusCode) {
response['GeoF_PointsList'].forEach((json) { var zones = response['GeoF_PointsList'];
zones.forEach((json) {
geoZones.add(GeoZonesResponseModel().fromJson(json)); geoZones.add(GeoZonesResponseModel().fromJson(json));
}); });
var zonesJsonString = json.encode(zones);
AppSharedPreferences().setString(HMG_GEOFENCES, zonesJsonString);
debugPrint("GEO ZONES saved to AppPreferences with key '$HMG_GEOFENCES'");
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
return Future.error(error); return Future.error(error);

@ -143,16 +143,18 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
_firebaseMessaging.requestNotificationPermissions(); _firebaseMessaging.requestNotificationPermissions();
} }
// Flip Permission Checks [Zohaib Kambrani] // Flip Permission Checks [Zohaib Kambrani]
requestPermissions().then((results){ requestPermissions().then((results) {
if(results[Permission.locationAlways].isGranted if (results[Permission.locationAlways].isGranted || results[Permission.location].isGranted) {
|| results[Permission.location].isGranted ) debugPrint("Fetching GEO ZONES from HMG service...");
HMG_Geofencing(context) locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel()).then((geoZones) {
.loadZones() debugPrint("GEO ZONES saved to AppPreferences with key '$HMG_GEOFENCES'");
.then((instance) => instance.init()); debugPrint("Finished Fetching GEO ZONES from HMG service...");
projectViewModel.platformBridge().registerHmgGeofences();
if(results[Permission.notification].isGranted) });
}
if (results[Permission.notification].isGranted)
_firebaseMessaging.getToken().then((String token) { _firebaseMessaging.getToken().then((String token) {
sharedPref.setString(PUSH_TOKEN, token); sharedPref.setString(PUSH_TOKEN, token);
if (token != null && DEVICE_TOKEN == "") { if (token != null && DEVICE_TOKEN == "") {
@ -161,11 +163,11 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
} }
}); });
if(results[Permission.storage].isGranted); if (results[Permission.storage].isGranted) ;
if(results[Permission.camera].isGranted); if (results[Permission.camera].isGranted) ;
if(results[Permission.photos].isGranted); if (results[Permission.photos].isGranted) ;
if(results[Permission.accessMediaLocation].isGranted); if (results[Permission.accessMediaLocation].isGranted) ;
if(results[Permission.calendar].isGranted); if (results[Permission.calendar].isGranted) ;
}); });
// //
@ -307,13 +309,11 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
var permissionsGranted = await deviceCalendarPlugin.hasPermissions(); var permissionsGranted = await deviceCalendarPlugin.hasPermissions();
if (permissionsGranted.isSuccess && !permissionsGranted.data) { if (permissionsGranted.isSuccess && !permissionsGranted.data) {
permissionsGranted = await deviceCalendarPlugin.requestPermissions(); permissionsGranted = await deviceCalendarPlugin.requestPermissions();
if (!permissionsGranted.isSuccess || !permissionsGranted.data) { if (!permissionsGranted.isSuccess || !permissionsGranted.data) {}
}
} }
return permissionResults; return permissionResults;
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
projectViewModel = Provider.of(context); projectViewModel = Provider.of(context);

@ -1,189 +1,189 @@
import 'dart:convert'; // import 'dart:convert';
import 'dart:core'; // import 'dart:core';
import 'dart:io'; // import 'dart:io';
import 'dart:isolate'; // import 'dart:isolate';
import 'dart:math'; // import 'dart:math';
import 'dart:ui'; // import 'dart:ui';
//
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; // import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart'; // import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/LogGeoZoneRequestModel.dart'; // import 'package:diplomaticquarterapp/core/model/geofencing/requests/LogGeoZoneRequestModel.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/responses/GeoZonesResponseModel.dart'; // import 'package:diplomaticquarterapp/core/model/geofencing/responses/GeoZonesResponseModel.dart';
import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart'; // import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart';
import 'package:diplomaticquarterapp/locator.dart'; // import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; // import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; // import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:flutter/cupertino.dart'; // import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; // import 'package:flutter/foundation.dart';
import 'package:geofencing/geofencing.dart'; // import 'package:geofencing/geofencing.dart';
//
class HMG_Geofencing { // class HMG_Geofencing {
var _testTrigger = false; // var _testTrigger = false;
static var _isolatePortName = "hmg_geofencing_send_port"; // static var _isolatePortName = "hmg_geofencing_send_port";
//
List<GeoZonesResponseModel> _zones; // List<GeoZonesResponseModel> _zones;
List<String> registeredGeofences = []; // List<String> registeredGeofences = [];
//
final AndroidGeofencingSettings androidSettings = AndroidGeofencingSettings(initialTrigger: <GeofenceEvent>[GeofenceEvent.enter, GeofenceEvent.exit, GeofenceEvent.dwell], loiteringDelay: 1000 * 60); // final AndroidGeofencingSettings androidSettings = AndroidGeofencingSettings(initialTrigger: <GeofenceEvent>[GeofenceEvent.enter, GeofenceEvent.exit, GeofenceEvent.dwell], loiteringDelay: 1000 * 60);
//
final BuildContext context; // final BuildContext context;
final List<GeofenceEvent> triggers = List(); // final List<GeofenceEvent> triggers = List();
//
HMG_Geofencing(this.context) { // HMG_Geofencing(this.context) {
triggers.add(GeofenceEvent.enter); // triggers.add(GeofenceEvent.enter);
triggers.add(GeofenceEvent.exit); // triggers.add(GeofenceEvent.exit);
// triggers.add(GeofenceEvent.dwell); // // triggers.add(GeofenceEvent.dwell);
} // }
//
Future<HMG_Geofencing> loadZones() async{ // Future<HMG_Geofencing> loadZones() async{
_zones = await locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel()); // _zones = await locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel());
return this; // return this;
} // }
//
void init() async { // void init() async {
// debug check (Testing Geo Zones) // // debug check (Testing Geo Zones)
if (kDebugMode) { // if (kDebugMode) {
addTestingGeofences(); // addTestingGeofences();
} // }
_saveZones(); // _saveZones();
await GeofencingManager.initialize(); // await GeofencingManager.initialize();
await Future.delayed(Duration(seconds: 2)); // await Future.delayed(Duration(seconds: 2));
_registerIsolatePort(); // _registerIsolatePort();
_registerGeofences().then((value) { // _registerGeofences().then((value) {
debugPrint(value.toString()); // debugPrint(value.toString());
if(_testTrigger) { // if(_testTrigger) {
var events = [GeofenceEvent.enter,GeofenceEvent.exit]; // var events = [GeofenceEvent.enter,GeofenceEvent.exit];
events.shuffle(); // events.shuffle();
transitionTrigger(value, null, events.first); // transitionTrigger(value, null, events.first);
} // }
}); // });
//
} // }
//
void _saveZones() { // void _saveZones() {
var list = List(); // var list = List();
_zones.forEach((element) { // _zones.forEach((element) {
list.add(element.toJson()); // list.add(element.toJson());
}); // });
//
var jsonString = jsonEncode(list); // var jsonString = jsonEncode(list);
AppSharedPreferences pref = AppSharedPreferences(); // AppSharedPreferences pref = AppSharedPreferences();
pref.setString(HMG_GEOFENCES, jsonString); // pref.setString(HMG_GEOFENCES, jsonString);
} // }
//
Future<List<String>> _registerGeofences() async { // Future<List<String>> _registerGeofences() async {
registeredGeofences = await GeofencingManager.getRegisteredGeofenceIds(); // registeredGeofences = await GeofencingManager.getRegisteredGeofenceIds();
//
var maxLimit = Platform.isIOS ? 20 : 100; // var maxLimit = Platform.isIOS ? 20 : 100;
//
if (registeredGeofences.length < maxLimit) { // if (registeredGeofences.length < maxLimit) {
var notRegistered = _zones.where((element) => !(registeredGeofences.contains(element.geofenceId()))).toList(); // var notRegistered = _zones.where((element) => !(registeredGeofences.contains(element.geofenceId()))).toList();
for (int i = 0; i < notRegistered.length; i++) { // for (int i = 0; i < notRegistered.length; i++) {
var zone = notRegistered.elementAt(i); // var zone = notRegistered.elementAt(i);
var lat = double.tryParse(zone.latitude); // var lat = double.tryParse(zone.latitude);
var lon = double.tryParse(zone.longitude); // var lon = double.tryParse(zone.longitude);
var rad = double.tryParse(zone.radius.toString()); // var rad = double.tryParse(zone.radius.toString());
//
if (lat != null || lon != null || rad != null) { // if (lat != null || lon != null || rad != null) {
await GeofencingManager.registerGeofence(GeofenceRegion(zone.geofenceId(), lat, lon, rad, triggers), transitionTrigger); // await GeofencingManager.registerGeofence(GeofenceRegion(zone.geofenceId(), lat, lon, rad, triggers), transitionTrigger);
registeredGeofences.add(zone.geofenceId()); // registeredGeofences.add(zone.geofenceId());
if (registeredGeofences.length >= maxLimit) { // if (registeredGeofences.length >= maxLimit) {
break; // break;
} // }
await Future.delayed(Duration(milliseconds: 100)); // await Future.delayed(Duration(milliseconds: 100));
debugPrint("Geofence: ${zone.description} registered"); // debugPrint("Geofence: ${zone.description} registered");
} else { // } else {
debugPrint("Geofence: ${zone.description} registered"); // debugPrint("Geofence: ${zone.description} registered");
} // }
} // }
} // }
return registeredGeofences; // return registeredGeofences;
} // }
//
void addTestingGeofences() { // void addTestingGeofences() {
_zones.add(GeoZonesResponseModel.get("24.777577,46.652675", 150, "msH")); // _zones.add(GeoZonesResponseModel.get("24.777577,46.652675", 150, "msH"));
_zones.add(GeoZonesResponseModel.get("24.691136,46.650116", 150, "zkH")); // _zones.add(GeoZonesResponseModel.get("24.691136,46.650116", 150, "zkH"));
_zones.add(GeoZonesResponseModel.get("24.7087913,46.6656461", 150, "csO")); // _zones.add(GeoZonesResponseModel.get("24.7087913,46.6656461", 150, "csO"));
} // }
//
static void transitionTrigger(List<String> id, Location location, GeofenceEvent event) { // static void transitionTrigger(List<String> id, Location location, GeofenceEvent event) {
var dataToSend = id.map((element) => {"event": event, "geofence_id": element}).toList() ?? []; // var dataToSend = id.map((element) => {"event": event, "geofence_id": element}).toList() ?? [];
final SendPort send = IsolateNameServer.lookupPortByName(_isolatePortName); // final SendPort send = IsolateNameServer.lookupPortByName(_isolatePortName);
send?.send(dataToSend); // send?.send(dataToSend);
} // }
//
ReceivePort _port = ReceivePort(); // ReceivePort _port = ReceivePort();
void _registerIsolatePort() async{ // void _registerIsolatePort() async{
IsolateNameServer.registerPortWithName(_port.sendPort, _isolatePortName); // IsolateNameServer.registerPortWithName(_port.sendPort, _isolatePortName);
_port.listen((dynamic data) { // _port.listen((dynamic data) {
//
Future result = AppSharedPreferences().getStringWithDefaultValue(HMG_GEOFENCES,"[]"); // Future result = AppSharedPreferences().getStringWithDefaultValue(HMG_GEOFENCES,"[]");
result.then((jsonString){ // result.then((jsonString){
//
List jsonList = json.decode(jsonString) ?? []; // List jsonList = json.decode(jsonString) ?? [];
List<GeoZonesResponseModel> geoList = jsonList.map((e) => GeoZonesResponseModel().fromJson(e)).toList() ?? []; // List<GeoZonesResponseModel> geoList = jsonList.map((e) => GeoZonesResponseModel().fromJson(e)).toList() ?? [];
//
(data as List).forEach((element) async { // (data as List).forEach((element) async {
GeofenceEvent geofenceEvent = element["event"]; // GeofenceEvent geofenceEvent = element["event"];
String geofence_id = element["geofence_id"]; // String geofence_id = element["geofence_id"];
//
GeoZonesResponseModel geoZone = _findByGeofenceFrom(geoList, by: geofence_id); // GeoZonesResponseModel geoZone = _findByGeofenceFrom(geoList, by: geofence_id);
if(geoZone != null) { // if(geoZone != null) {
LocalNotification.getInstance().showNow( // LocalNotification.getInstance().showNow(
title: "GeofenceEvent: ${_nameOf(geofenceEvent)}", // title: "GeofenceEvent: ${_nameOf(geofenceEvent)}",
subtitle: geoZone.description, // subtitle: geoZone.description,
payload: json.encode(geoZone.toJson())); // payload: json.encode(geoZone.toJson()));
//
_logGeoZoneToServer(zoneId: geoZone.geofId, transition: _idOf(geofenceEvent)); // _logGeoZoneToServer(zoneId: geoZone.geofId, transition: _idOf(geofenceEvent));
} // }
//
await Future.delayed(Duration(milliseconds: 700)); // await Future.delayed(Duration(milliseconds: 700));
//
}); // });
//
}); // });
}); // });
} // }
//
_logGeoZoneToServer({int zoneId, int transition}){ // _logGeoZoneToServer({int zoneId, int transition}){
locator<GeofencingServices>() // locator<GeofencingServices>()
.logGeoZone(LogGeoZoneRequestModel(GeoType: transition, PointsID: zoneId ?? 1)) // .logGeoZone(LogGeoZoneRequestModel(GeoType: transition, PointsID: zoneId ?? 1))
.then((response){ // .then((response){
//
}).catchError((error){ // }).catchError((error){
//
}); // });
//
} // }
//
GeoZonesResponseModel _findByGeofenceFrom(List<GeoZonesResponseModel> list, { String by}) { // GeoZonesResponseModel _findByGeofenceFrom(List<GeoZonesResponseModel> list, { String by}) {
var have = list.where((element) => element.geofenceId() == by).toList().first; // var have = list.where((element) => element.geofenceId() == by).toList().first;
return have; // return have;
} // }
//
String _nameOf(GeofenceEvent event) { // String _nameOf(GeofenceEvent event) {
switch (event) { // switch (event) {
case GeofenceEvent.enter: // case GeofenceEvent.enter:
return "Enter"; // return "Enter";
case GeofenceEvent.exit: // case GeofenceEvent.exit:
return "Exit"; // return "Exit";
case GeofenceEvent.dwell: // case GeofenceEvent.dwell:
return "dWell"; // return "dWell";
default: // default:
return event.toString(); // return event.toString();
} // }
} // }
//
int _idOf(GeofenceEvent event){ // int _idOf(GeofenceEvent event){
switch (event) { // switch (event) {
case GeofenceEvent.enter: // case GeofenceEvent.enter:
return 1; // return 1;
case GeofenceEvent.exit: // case GeofenceEvent.exit:
return 2; // return 2;
case GeofenceEvent.dwell: // case GeofenceEvent.dwell:
return 3; // return 3;
default: // default:
return -1; // return -1;
} // }
} // }
} // }

@ -1,5 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/localized_values.dart'; import 'package:diplomaticquarterapp/config/localized_values.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart'; import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart';
@ -34,7 +35,13 @@ class PlatformBridge {
switch (methodCall.method) { switch (methodCall.method) {
case 'localizedValue': case 'localizedValue':
String key = methodCall.arguments.toString(); String key = methodCall.arguments.toString();
return platformLocalizedText(key); return localizedValue(key);
case 'getGeofencePreferenceKey':
return getGeofencePreferenceKey();
case 'getLogGeofenceFullUrl':
return getLogGeofenceFullUrl();
case 'test': case 'test':
return 123.0; return 123.0;
@ -49,12 +56,22 @@ class PlatformBridge {
//--------------------------------- //---------------------------------
// Incoming below // Incoming below
//--------------------------------- //---------------------------------
static Future<String> platformLocalizedText(String forKey) async { static Future<String> localizedValue(String forKey) async {
String currentLanguage = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); String currentLanguage = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
Object localized = platformLocalizedValues[forKey][currentLanguage]; Object localized = platformLocalizedValues[forKey][currentLanguage];
return (localized != null || (localized is String)) ? localized : forKey; return (localized != null || (localized is String)) ? localized : forKey;
} }
static Future<String> getGeofencePreferenceKey() async {
var res = await sharedPref.getStringWithDefaultValue(HMG_GEOFENCES, "[]");
return res;
}
static Future<String> getLogGeofenceFullUrl() async {
var res = BASE_URL + LOG_GEO_ZONES;
return res;
}
//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//
//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//
@ -67,6 +84,7 @@ class PlatformBridge {
static const is_hmg_network_available_method = "isHMGNetworkAvailable"; static const is_hmg_network_available_method = "isHMGNetworkAvailable";
static const enable_wifi_if_not = "enableWifiIfNot"; static const enable_wifi_if_not = "enableWifiIfNot";
static const show_loading_method = "loading"; static const show_loading_method = "loading";
static const register_Hmg_Geofences = "registerHmgGeofences";
Future<Object> connectHMGInternetWifi(String patientId) { Future<Object> connectHMGInternetWifi(String patientId) {
print("Invoking platform method: $hmg_internet_wifi_connect_method"); print("Invoking platform method: $hmg_internet_wifi_connect_method");
@ -116,4 +134,9 @@ class PlatformBridge {
print(e); print(e);
} }
} }
// GEO Fences
void registerHmgGeofences() async {
final int result = await platform.invokeMethod(register_Hmg_Geofences);
}
} }

@ -162,7 +162,6 @@ dependencies:
# Dep by Zohaib # Dep by Zohaib
shimmer: ^1.1.2 shimmer: ^1.1.2
geofencing: ^0.1.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save