import 'package:geolocator/geolocator.dart'; import 'package:intaleq_rider/services/geofencing_service.dart'; import 'package:get/get.dart'; import 'package:flutter/material.dart'; class GeoLocation { Future getCurrentLocation() async { bool serviceEnabled; LocationPermission permission; // Check if location services are enabled. serviceEnabled = await Geolocator.isLocationServiceEnabled(); if (!serviceEnabled) { // Location services are not enabled, so we request the user to enable it. return Future.error('Location services are disabled.'); } permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { // Prominent Disclosure for Background Location bool? userAgreed = await Get.defaultDialog( title: 'صلاحية الموقع'.tr, middleText: 'يجمع تطبيق انطلق بيانات الموقع لتفعيل ميزة التتبع الجغرافي (Geofence) ولتمكين السائق من الوصول إليك بدقة وتتبع رحلتك حتى عندما يكون التطبيق في الخلفية أو مغلقاً.'.tr, titleStyle: const TextStyle(fontWeight: FontWeight.bold), textConfirm: 'موافق'.tr, textCancel: 'إلغاء'.tr, confirmTextColor: Colors.white, onConfirm: () => Get.back(result: true), onCancel: () => Get.back(result: false), barrierDismissible: false, ); if (userAgreed != true) { return Future.error('Location permissions are denied'); } permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { // Permissions are denied, we cannot fetch the location. return Future.error('Location permissions are denied'); } } if (permission == LocationPermission.deniedForever) { // Permissions are denied forever, we cannot request permissions. return Future.error( 'Location permissions are permanently denied, we cannot request permissions.'); } // When we reach here, permissions are granted and we can fetch the location. final position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); // Update Geofences based on the fresh location try { IntaleqGeofencingService.syncZonesWithServer(position.latitude, position.longitude); } catch (e) { // Ignore errors so it doesn't break the main location flow } return position; } }