background_locator_fixed icon indicating copy to clipboard operation
background_locator_fixed copied to clipboard

In android 12+, service stopped automatically after random time.

Open Abdulah-butt opened this issue 1 year ago • 1 comments

import 'dart:isolate'; import 'dart:ui';

import 'package:background_locator_2/background_locator.dart'; import 'package:background_locator_2/location_dto.dart'; import 'package:background_locator_2/settings/android_settings.dart'; import 'package:background_locator_2/settings/ios_settings.dart'; import 'package:background_locator_2/settings/locator_settings.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:route/data/repositories/hive_repository.dart'; import 'package:route/data/repositories/rest_api_repository.dart'; import 'package:route/domain/entites/local_trip.dart'; import 'package:route/domain/repositories/database_repository.dart'; import 'package:route/domain/repositories/json_body/update_location_json_body.dart'; import 'package:route/domain/repositories/local_storage_repository.dart'; import 'package:route/network/network_repository.dart'; import 'package:route/util/dependency/app_dependency.dart'; import 'package:route/util/services/location_service.dart'; import 'package:route/util/services/phone_info_service.dart';

class BackgroundLocatorRepository { LocalStorageRepository localStorageRepository = HiveRepository(); static DatabaseRepository databaseRepository = RestAPIRepository( networkRepository: NetworkRepository(localStorageRepository: HiveRepository())); static PhoneInfoService phoneInfoService = PhoneInfoService();

ReceivePort port = ReceivePort(); static const String _isolateName = "LocatorIsolate";

bool isRunning = false; LocationService locationService = LocationService();

late Function(LatLng) onLocationChange;

initialize() { if (IsolateNameServer.lookupPortByName(_isolateName) != null) { IsolateNameServer.removePortNameMapping(_isolateName); } IsolateNameServer.registerPortWithName(port.sendPort, _isolateName); port.listen( (dynamic data) async { // debugPrint("location changes : ${data}"); // await _updateUI(data); }, ); _initPlatformState(); }

Future _updateUI(dynamic data) async { LocationDto? locationDto = (data != null) ? LocationDto.fromJson(data) : null; await _updateNotificationText(locationDto); }

Future _updateNotificationText(LocationDto? data) async { if (data == null) { return; } await BackgroundLocator.updateNotificationText( title: "new location received", msg: "${DateTime.now()}", bigMsg: "${data.latitude}, ${data.longitude}"); }

Future _initPlatformState() async { debugPrint('Initializing...'); await BackgroundLocator.initialize(); debugPrint('Initialization done'); isRunning = await BackgroundLocator.isServiceRunning(); debugPrint('Running ${isRunning.toString()}'); }

void onStop() async { IsolateNameServer.removePortNameMapping(_isolateName); await BackgroundLocator.unRegisterLocationUpdate(); isRunning = await BackgroundLocator.isServiceRunning(); debugPrint("IS RUNNING : $isRunning"); }

void onStart(LocalTrip localTrip) async { await localStorageRepository.saveLocalTrip(localTrip: localTrip); await _startLocator(); isRunning = await BackgroundLocator.isServiceRunning(); debugPrint("IS RUNNING : $isRunning"); }

Future _startLocator() async { Map<String, dynamic> data = {'countInit': 1}; return await BackgroundLocator.registerLocationUpdate(callback, initCallback: initCallback, initDataCallback: data, disposeCallback: disposeCallback, iosSettings: const IOSSettings( accuracy: LocationAccuracy.NAVIGATION, distanceFilter: 0, stopWithTerminate: true), autoStop: false, androidSettings: const AndroidSettings( accuracy: LocationAccuracy.NAVIGATION, interval: 5, distanceFilter: 0, client: LocationClient.google, androidNotificationSettings: AndroidNotificationSettings( notificationChannelName: 'Location tracking', notificationTitle: 'Location Tracking', notificationMsg: 'Track location in background', notificationBigMsg: 'Background location is on to keep the app up-tp-date with your location. This is required for main features to work properly when the app is not running.', notificationIconColor: Colors.grey, notificationTapCallback: notificationCallback))); }

@pragma('vm:entry-point') static void callback(LocationDto locationDto) async { final SendPort? send = IsolateNameServer.lookupPortByName(_isolateName); print("=============> SENDING TO PORT : ${locationDto.toJson()}"); if (!HiveRepository.isInitialized) { await HiveRepository.initialize(); } LocalStorageRepository _localStorageRepository = HiveRepository(); LocalTrip? localTrip = await _localStorageRepository.getLocalTrip(); databaseRepository .updateTripLocation( updateLocationJsonBody: UpdateLocationJsonBody( localId: int.parse(localTrip!.localId), imei: await phoneInfoService.getIMEI(), lat: locationDto.latitude.toString(), long: locationDto.longitude.toString(), time: DateTime.now().millisecondsSinceEpoch.toString())) .then((value) {}) .onError((error, stackTrace) { print("ERROR WHILE CALLING UPDATE ${error.toString()}"); }); send?.send(locationDto.toJson()); }

//Optional @pragma('vm:entry-point') static void initCallback(dynamic _) { print('Plugin initialization'); }

//Optional @pragma('vm:entry-point') static void notificationCallback() { print('User clicked on the notification'); }

static void disposeCallback() async { print("++++++++ DISPOSED"); final SendPort? send = IsolateNameServer.lookupPortByName(_isolateName); send?.send(null); } }

Abdulah-butt avatar Aug 09 '23 16:08 Abdulah-butt