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