From 5c0f4d345d65e691bc448893cd71ac32718918e2 Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Wed, 6 Nov 2024 13:27:31 +0100 Subject: [PATCH] get location from starting app --- .../android/app/src/main/AndroidManifest.xml | 3 + .../app/src/profile/AndroidManifest.xml | 12 ++ covas_mobile/ios/Runner/Info.plist | 2 + covas_mobile/lib/pages/ListItemMenu.dart | 133 ++++++++++++- .../Flutter/GeneratedPluginRegistrant.swift | 2 + covas_mobile/pubspec.lock | 186 +++++++++++------- covas_mobile/pubspec.yaml | 3 +- .../flutter/generated_plugin_registrant.cc | 6 + .../windows/flutter/generated_plugins.cmake | 2 + 9 files changed, 278 insertions(+), 71 deletions(-) diff --git a/covas_mobile/android/app/src/main/AndroidManifest.xml b/covas_mobile/android/app/src/main/AndroidManifest.xml index 289462e..71290e3 100644 --- a/covas_mobile/android/app/src/main/AndroidManifest.xml +++ b/covas_mobile/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ + + + diff --git a/covas_mobile/android/app/src/profile/AndroidManifest.xml b/covas_mobile/android/app/src/profile/AndroidManifest.xml index 6e10330..323e1c6 100644 --- a/covas_mobile/android/app/src/profile/AndroidManifest.xml +++ b/covas_mobile/android/app/src/profile/AndroidManifest.xml @@ -5,4 +5,16 @@ to allow setting breakpoints, to provide hot reload, etc. --> + + + + + + + + diff --git a/covas_mobile/ios/Runner/Info.plist b/covas_mobile/ios/Runner/Info.plist index cf192c9..436567c 100644 --- a/covas_mobile/ios/Runner/Info.plist +++ b/covas_mobile/ios/Runner/Info.plist @@ -45,5 +45,7 @@ CADisableMinimumFrameDurationOnPhone + NSLocationWhenInUseUsageDescription + Your location is needed for showing nearby events diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index 145255d..1a83313 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -10,7 +10,9 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'dart:math'; +import 'package:geolocator/geolocator.dart'; import '../variable/globals.dart' as globals; +import 'package:permission_handler/permission_handler.dart'; void main() { initializeDateFormatting("fr_FR", null).then((_) => runApp(const MyApp())); @@ -63,8 +65,137 @@ class _MyHomePageState extends State { @override void initState() { super.initState(); + _checkLocationPermission(); // Initialize data fetch when the page loads - _fetchInitialData(); + _getCurrentLocation(); + } + + // Check if location permission is granted + Future _checkLocationPermission() async { + PermissionStatus status = await Permission.location.status; + + if (status.isGranted) { + print("Location permission granted"); + } else if (status.isDenied) { + print("Location permission denied"); + _requestLocationPermission(); + } else if (status.isPermanentlyDenied) { + print("Location permission permanently denied"); + openAppSettings(); + } + } + + // Request location permission + Future _requestLocationPermission() async { + PermissionStatus status = await Permission.location.request(); + + if (status.isGranted) { + print("Location permission granted"); + } else if (status.isDenied) { + print("Location permission denied"); + _fetchInitialData(); + } else if (status.isPermanentlyDenied) { + print("Location permission permanently denied"); + openAppSettings(); + } + } + + // Open app settings to allow user to grant permission manually + Future _openAppSettings() async { + bool opened = await openAppSettings(); + if (opened) { + print("App settings opened"); + } else { + print("Failed to open app settings"); + _fetchInitialData(); + } + } + + // Get the device's current location + Future _getCurrentLocation() async { + // Get the current position with high accuracy + LocationSettings locationSettings = LocationSettings( + accuracy: LocationAccuracy.high, + distanceFilter: + 10, // Optional: Minimum distance (in meters) to trigger location update + ); + + Position position = await Geolocator.getCurrentPosition( + locationSettings: locationSettings, + ); + + // Reverse geocode: Get city and country from latitude and longitude using Mapbox Search API + final place = + await _getCityAndCountry(position.latitude, position.longitude); + } + + // Method to get city and country from latitude and longitude using Mapbox API + Future _getCityAndCountry(double latitude, double longitude) async { + await dotenv.load(fileName: ".env"); // Load .env file + + final mapboxAccessToken = dotenv.env['MAPBOX_ACCESS_TOKEN'] ?? ''; + final url = Uri.parse( + 'https://api.mapbox.com/geocoding/v5/mapbox.places/$longitude,$latitude.json?access_token=$mapboxAccessToken', + ); + + try { + // Send GET request to Mapbox API + final response = await http.get(url); + + // If the request is successful (HTTP status 200) + print("status mapbox : ${response.statusCode}"); + if (response.statusCode == 200) { + // Parse the response body + final data = json.decode(response.body); + + // Extract the city and country from the response + final features = data['features']; + + if (features.isNotEmpty) { + String city = _getCityFromFeatures(features); + String country = _getCountryFromFeatures(features); + print("city : ${city} ${country}"); + if (city.isNotEmpty && country.isNotEmpty) { + setState(() { + inputGeo.text = "${city}, ${country}"; + }); + fetchPostsByLocation(latitude, longitude); + } else { + _fetchInitialData(); + } + } else { + _fetchInitialData(); + } + } else { + _fetchInitialData(); + throw Exception('Failed to load location data'); + } + } catch (e) { + print("Error getting city and country: $e"); + _fetchInitialData(); + } + } + + // Helper function to extract the city from the Mapbox features array + String _getCityFromFeatures(List features) { + for (var feature in features) { + if (feature['place_type'] != null && + feature['place_type'].contains('place')) { + return feature['text'] ?? ''; + } + } + return ''; + } + + // Helper function to extract the country from the Mapbox features array + String _getCountryFromFeatures(List features) { + for (var feature in features) { + if (feature['place_type'] != null && + feature['place_type'].contains('country')) { + return feature['text'] ?? ''; + } + } + return ''; } // Fetch initial data from API or any other necessary initialization diff --git a/covas_mobile/macos/Flutter/GeneratedPluginRegistrant.swift b/covas_mobile/macos/Flutter/GeneratedPluginRegistrant.swift index 4b4e1ac..53d8e6c 100644 --- a/covas_mobile/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/covas_mobile/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,11 +6,13 @@ import FlutterMacOS import Foundation import file_selector_macos +import geolocator_apple import path_provider_foundation import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) } diff --git a/covas_mobile/pubspec.lock b/covas_mobile/pubspec.lock index cbc50cd..9bad8b5 100644 --- a/covas_mobile/pubspec.lock +++ b/covas_mobile/pubspec.lock @@ -1,14 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.dev" - source: hosted - version: "3.6.1" async: dependency: transitive description: @@ -193,6 +185,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.3+2" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -248,6 +248,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "0ec58b731776bc43097fcf751f79681b6a8f6d3bc737c94779fe9f1ad73c1a81" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "7aefc530db47d90d0580b552df3242440a10fe60814496a979aa67aa98b1fd47" + url: "https://pub.dev" + source: hosted + version: "4.6.1" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd + url: "https://pub.dev" + source: hosted + version: "2.3.7" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: "2ed69328e05cd94e7eb48bb0535f5fc0c0c44d1c4fa1e9737267484d05c29b5e" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + url: "https://pub.dev" + source: hosted + version: "0.2.3" http: dependency: "direct main" description: @@ -264,14 +312,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" - image: - dependency: transitive - description: - name: image - sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" - url: "https://pub.dev" - source: hosted - version: "3.3.0" image_picker: dependency: "direct main" description: @@ -344,14 +384,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" json_annotation: dependency: transitive description: @@ -392,38 +424,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" - mapbox_gl: - dependency: "direct main" - description: - name: mapbox_gl - sha256: d78907338ff232e3cf6c1d6dba45e6a8814069496fd352e49bb1967d498f09af - url: "https://pub.dev" - source: hosted - version: "0.16.0" - mapbox_gl_dart: - dependency: transitive - description: - name: mapbox_gl_dart - sha256: de6d03718e5eb05c9eb1ddaae7f0383b28acb5afa16405e1deed7ff04dd34f3d - url: "https://pub.dev" - source: hosted - version: "0.2.1" - mapbox_gl_platform_interface: - dependency: transitive - description: - name: mapbox_gl_platform_interface - sha256: b7c1490b022e650afd20412bdf8ae45a1897118b7ce6049ef6c42df09193d4b2 - url: "https://pub.dev" - source: hosted - version: "0.16.0" - mapbox_gl_web: - dependency: transitive - description: - name: mapbox_gl_web - sha256: e77113bf95a4f321ff44938232517e0f2725aae991f0b283af1afaa7e7a58aca - url: "https://pub.dev" - source: hosted - version: "0.16.0" matcher: dependency: transitive description: @@ -512,14 +512,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" - petitparser: - dependency: transitive + permission_handler: + dependency: "direct main" description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + name: permission_handler + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "11.3.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" + url: "https://pub.dev" + source: hosted + version: "12.0.13" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + url: "https://pub.dev" + source: hosted + version: "9.4.5" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + url: "https://pub.dev" + source: hosted + version: "0.1.3+2" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" platform: dependency: transitive description: @@ -605,6 +645,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -669,6 +717,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: @@ -701,14 +757,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" sdks: dart: ">=3.4.0 <4.0.0" flutter: ">=3.22.0" diff --git a/covas_mobile/pubspec.yaml b/covas_mobile/pubspec.yaml index e289a3c..6bf13bd 100644 --- a/covas_mobile/pubspec.yaml +++ b/covas_mobile/pubspec.yaml @@ -46,7 +46,8 @@ dependencies: image_picker: ^1.1.2 date_format_field: ^0.1.0 textfield_tags: ^3.0.1 - mapbox_gl: ^0.16.0 + geolocator: ^13.0.1 + permission_handler: ^11.3.1 dev_dependencies: flutter_test: diff --git a/covas_mobile/windows/flutter/generated_plugin_registrant.cc b/covas_mobile/windows/flutter/generated_plugin_registrant.cc index 77ab7a0..921279f 100644 --- a/covas_mobile/windows/flutter/generated_plugin_registrant.cc +++ b/covas_mobile/windows/flutter/generated_plugin_registrant.cc @@ -7,8 +7,14 @@ #include "generated_plugin_registrant.h" #include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/covas_mobile/windows/flutter/generated_plugins.cmake b/covas_mobile/windows/flutter/generated_plugins.cmake index a423a02..71dd257 100644 --- a/covas_mobile/windows/flutter/generated_plugins.cmake +++ b/covas_mobile/windows/flutter/generated_plugins.cmake @@ -4,6 +4,8 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_windows + geolocator_windows + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST