diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a930ec3..0ca2917 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
+
+
+
+
+
+
+
+
();
+ var isLoadingLocation = false.obs;
+
+ /// Fetch user's current location
+ Future fetchCurrentLocation() async {
+ isLoadingLocation.value = true;
+
+ try {
+ // Check if location service is enabled
+ if (!await FlLocation.isLocationServicesEnabled) {
+ Get.snackbar(
+ 'Location Services Disabled',
+ 'Please enable location services',
+ snackPosition: SnackPosition.BOTTOM,
+ );
+ currentUserLocation.value = fallbackLatLng;
+ isLoadingLocation.value = false;
+ return;
+ }
+
+ // Check location permission
+ var permission = await FlLocation.checkLocationPermission();
+
+ if (permission == LocationPermission.deniedForever) {
+ Get.snackbar(
+ 'Location Permission Denied',
+ 'Using default location (New Delhi)',
+ snackPosition: SnackPosition.BOTTOM,
+ );
+ currentUserLocation.value = fallbackLatLng;
+ isLoadingLocation.value = false;
+ return;
+ }
+
+ if (permission == LocationPermission.denied) {
+ // Request permission
+ permission = await FlLocation.requestLocationPermission();
+
+ if (permission == LocationPermission.denied ||
+ permission == LocationPermission.deniedForever) {
+ Get.snackbar(
+ 'Location Permission Denied',
+ 'Using default location (New Delhi)',
+ snackPosition: SnackPosition.BOTTOM,
+ );
+ currentUserLocation.value = fallbackLatLng;
+ isLoadingLocation.value = false;
+ return;
+ }
+ }
+
+ // Get current location
+ final location = await FlLocation.getLocation(
+ accuracy: LocationAccuracy.best,
+ timeLimit: const Duration(seconds: 10),
+ );
+
+ if (location.latitude != 0.0 && location.longitude != 0.0) {
+ currentUserLocation.value = LatLng(location.latitude, location.longitude);
+ } else {
+ currentUserLocation.value = fallbackLatLng;
+ }
+ } catch (e) {
+ Get.snackbar(
+ 'Location Error',
+ 'Could not fetch location. Using default location.',
+ snackPosition: SnackPosition.BOTTOM,
+ );
+ currentUserLocation.value = fallbackLatLng;
+ } finally {
+ isLoadingLocation.value = false;
+ }
+ }
void onPickerScreenReady() {
if (mapController.camera.center != pickerLatLng.value) {
@@ -27,7 +101,11 @@ class LocationController extends GetxController {
}
Future onSelectCondition(int index) async {
- pickerLatLng.value = defaultLatLng;
+ // Fetch current location before opening picker
+ await fetchCurrentLocation();
+
+ // Use current user location or fallback
+ pickerLatLng.value = currentUserLocation.value ?? fallbackLatLng;
final result = await Get.toNamed(AppRoutes.locationPicker);
diff --git a/lib/app/modules/smart_control/views/location/location_condition_view.dart b/lib/app/modules/smart_control/views/location/location_condition_view.dart
index bc52cc6..4c88c7e 100644
--- a/lib/app/modules/smart_control/views/location/location_condition_view.dart
+++ b/lib/app/modules/smart_control/views/location/location_condition_view.dart
@@ -65,45 +65,61 @@ class LocationConditionScreen extends StatelessWidget {
required bool isRound,
required bool isSelected,
}) {
- return GestureDetector(
- onTap: () => LocationController.to.onSelectCondition(index),
- child: Container(
- margin: EdgeInsets.symmetric(vertical: isRound ? 4 : 6),
- padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
- decoration: BoxDecoration(
- color: isSelected
- ? uac_colors.AppColors.green.withOpacity(0.2)
- : uac_colors.AppColors.grayBlack,
- borderRadius: BorderRadius.circular(20),
- ),
- child: Row(
- mainAxisAlignment:
- isRound ? MainAxisAlignment.center : MainAxisAlignment.start,
- children: [
- Icon(
- _getLocationConditionIcon(type),
- size: isRound ? 16 : 18,
- color: isSelected ? uac_colors.AppColors.green : Colors.white,
- ),
- const SizedBox(width: 8),
- Flexible(
- child: Text(
- label,
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- style: TextStyle(
- fontSize:
- isSelected ? (isRound ? 13 : 15) : (isRound ? 12 : 14),
- fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
- color:
- isSelected ? uac_colors.AppColors.green : Colors.white,
+ return Obx(() {
+ final isLoading = LocationController.to.isLoadingLocation.value;
+
+ return GestureDetector(
+ onTap: isLoading ? null : () => LocationController.to.onSelectCondition(index),
+ child: Container(
+ margin: EdgeInsets.symmetric(vertical: isRound ? 4 : 6),
+ padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
+ decoration: BoxDecoration(
+ color: isSelected
+ ? uac_colors.AppColors.green.withOpacity(0.2)
+ : uac_colors.AppColors.grayBlack,
+ borderRadius: BorderRadius.circular(20),
+ ),
+ child: Row(
+ mainAxisAlignment:
+ isRound ? MainAxisAlignment.center : MainAxisAlignment.start,
+ children: [
+ if (isLoading && isSelected)
+ SizedBox(
+ width: isRound ? 16 : 18,
+ height: isRound ? 16 : 18,
+ child: CircularProgressIndicator(
+ strokeWidth: 2,
+ valueColor: AlwaysStoppedAnimation(
+ uac_colors.AppColors.green,
+ ),
+ ),
+ )
+ else
+ Icon(
+ _getLocationConditionIcon(type),
+ size: isRound ? 16 : 18,
+ color: isSelected ? uac_colors.AppColors.green : Colors.white,
+ ),
+ const SizedBox(width: 8),
+ Flexible(
+ child: Text(
+ label,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ fontSize:
+ isSelected ? (isRound ? 13 : 15) : (isRound ? 12 : 14),
+ fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
+ color:
+ isSelected ? uac_colors.AppColors.green : Colors.white,
+ ),
),
),
- ),
- ],
+ ],
+ ),
),
- ),
- );
+ );
+ });
}
IconData _getLocationConditionIcon(int type) {
diff --git a/pubspec.lock b/pubspec.lock
index d63aef4..de10e1f 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -21,26 +21,26 @@ packages:
dependency: transitive
description:
name: characters
- sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
- version: "1.3.0"
+ version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
- sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
- version: "1.1.1"
+ version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
- sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
+ sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
- version: "1.18.0"
+ version: "1.19.1"
dart_earcut:
dependency: transitive
description:
@@ -53,10 +53,10 @@ packages:
dependency: transitive
description:
name: fake_async
- sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
- version: "1.3.1"
+ version: "1.3.3"
ffi:
dependency: transitive
description:
@@ -164,26 +164,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
+ sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
- version: "10.0.4"
+ version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
+ sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
- version: "3.0.3"
+ version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
- sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
- version: "3.0.1"
+ version: "3.0.2"
lints:
dependency: transitive
description:
@@ -212,26 +212,26 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
+ sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
- version: "0.12.16+1"
+ version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
+ sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
- version: "0.8.0"
+ version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
- sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
- version: "1.12.0"
+ version: "1.17.0"
mgrs_dart:
dependency: transitive
description:
@@ -244,10 +244,10 @@ packages:
dependency: transitive
description:
name: path
- sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
+ sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
- version: "1.9.0"
+ version: "1.9.1"
path_provider:
dependency: "direct main"
description:
@@ -332,7 +332,7 @@ packages:
dependency: transitive
description: flutter
source: sdk
- version: "0.0.99"
+ version: "0.0.0"
source_span:
dependency: transitive
description:
@@ -361,18 +361,18 @@ packages:
dependency: transitive
description:
name: stack_trace
- sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
+ sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
- version: "1.11.1"
+ version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
- sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
+ sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.4"
string_scanner:
dependency: transitive
description:
@@ -401,10 +401,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
+ sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
source: hosted
- version: "0.7.0"
+ version: "0.7.7"
typed_data:
dependency: transitive
description:
@@ -425,10 +425,10 @@ packages:
dependency: transitive
description:
name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
- version: "2.1.4"
+ version: "2.2.0"
vm_service:
dependency: transitive
description:
@@ -462,5 +462,5 @@ packages:
source: hosted
version: "1.1.0"
sdks:
- dart: ">=3.4.3 <4.0.0"
+ dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.22.0"