25-12-2/1
This commit is contained in:
@@ -44,8 +44,8 @@ android {
|
|||||||
applicationId = "com.intaleq_driver"
|
applicationId = "com.intaleq_driver"
|
||||||
minSdkVersion = 23
|
minSdkVersion = 23
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 47
|
versionCode = 48
|
||||||
versionName = '1.0.47' // I've used the higher version name
|
versionName = '1.0.48' // I've used the higher version name
|
||||||
multiDexEnabled = true
|
multiDexEnabled = true
|
||||||
|
|
||||||
ndk {
|
ndk {
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ class FirebaseMessagesController extends GetxController {
|
|||||||
driverToken = myList[14].toString();
|
driverToken = myList[14].toString();
|
||||||
Get.put(HomeCaptainController()).changeRideId();
|
Get.put(HomeCaptainController()).changeRideId();
|
||||||
update();
|
update();
|
||||||
Get.to(() => OrderSpeedRequest(), arguments: {
|
Get.to(() => OrderRequestPage(), arguments: {
|
||||||
'myListString': myListString,
|
'myListString': myListString,
|
||||||
'DriverList': myList,
|
'DriverList': myList,
|
||||||
'body': body
|
'body': body
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ import 'dart:convert';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'dart:ui' as ui; // للألوان
|
||||||
// import 'package:google_maps_flutter/google_maps_flutter.dart';
|
// import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
// import 'package:flutter_map/flutter_map.dart';
|
// import 'package:flutter_map/flutter_map.dart';
|
||||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
// import 'package:latlong2/latlong.dart'
|
// import 'package:latlong2/latlong.dart'
|
||||||
// as latlng; // هذا مهم جداً للتعامل مع إحداثيات OSM
|
// as latlng; // هذا مهم جداً للتعامل مع إحداثيات OSM
|
||||||
import 'package:sefer_driver/constant/box_name.dart';
|
import 'package:sefer_driver/constant/box_name.dart';
|
||||||
@@ -57,6 +59,11 @@ class HomeCaptainController extends GetxController {
|
|||||||
bool mapType = false;
|
bool mapType = false;
|
||||||
bool mapTrafficON = false;
|
bool mapTrafficON = false;
|
||||||
double widthMapTypeAndTraffic = 50;
|
double widthMapTypeAndTraffic = 50;
|
||||||
|
// === متغيرات الهيت ماب الجديدة ===
|
||||||
|
bool isHeatmapVisible = false;
|
||||||
|
Set<Polygon> heatmapPolygons =
|
||||||
|
{}; // سنستخدم Polygon لرسم المربعات على جوجل مابس
|
||||||
|
|
||||||
// Inject the LocationController class
|
// Inject the LocationController class
|
||||||
// final locationController = Get.put(LocationController());
|
// final locationController = Get.put(LocationController());
|
||||||
// الكود الصحيح
|
// الكود الصحيح
|
||||||
@@ -69,6 +76,83 @@ class HomeCaptainController extends GetxController {
|
|||||||
return "${duration.inHours}:$twoDigitMinutes:$twoDigitSeconds";
|
return "${duration.inHours}:$twoDigitMinutes:$twoDigitSeconds";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// دالة لتغيير حالة الهيت ماب (عرض/إخفاء)
|
||||||
|
void toggleHeatmap() async {
|
||||||
|
isHeatmapVisible = !isHeatmapVisible;
|
||||||
|
if (isHeatmapVisible) {
|
||||||
|
await _fetchAndDrawHeatmap();
|
||||||
|
} else {
|
||||||
|
heatmapPolygons.clear();
|
||||||
|
}
|
||||||
|
update(); // تحديث الواجهة
|
||||||
|
}
|
||||||
|
|
||||||
|
// دالة جلب البيانات ورسمها
|
||||||
|
Future<void> _fetchAndDrawHeatmap() async {
|
||||||
|
isLoading = true;
|
||||||
|
update();
|
||||||
|
|
||||||
|
// استبدل هذا الرابط برابط ملف JSON الذي يولده كود PHP
|
||||||
|
// مثال: https://your-domain.com/api/driver/heatmap_data.json
|
||||||
|
final String jsonUrl =
|
||||||
|
"https://rides.intaleq.xyz/intaleq/ride/heatmap/heatmap_data.json";
|
||||||
|
|
||||||
|
try {
|
||||||
|
final response = await http.get(Uri.parse(jsonUrl));
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
final List<dynamic> data = json.decode(response.body);
|
||||||
|
_generateGoogleMapPolygons(data);
|
||||||
|
} else {
|
||||||
|
print("Failed to load heatmap data");
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print("Error fetching heatmap: $e");
|
||||||
|
} finally {
|
||||||
|
isLoading = false;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
} // تحويل البيانات إلى مربعات على خريطة جوجل
|
||||||
|
|
||||||
|
void _generateGoogleMapPolygons(List<dynamic> data) {
|
||||||
|
Set<Polygon> tempPolygons = {};
|
||||||
|
// نصف قطر المربع (تقريباً 0.0005 يعادل 50-60 متر، مما يعطي مربع 100 متر)
|
||||||
|
// يجب أن يتناسب مع الـ precision المستخدم في PHP
|
||||||
|
double offset = 0.005;
|
||||||
|
|
||||||
|
for (var point in data) {
|
||||||
|
double lat = double.parse(point['lat'].toString());
|
||||||
|
double lng = double.parse(point['lng'].toString());
|
||||||
|
int count = int.parse(point['count'].toString());
|
||||||
|
|
||||||
|
// تحديد اللون بناءً على الكثافة
|
||||||
|
Color color;
|
||||||
|
if (count >= 5) {
|
||||||
|
color = Colors.red.withOpacity(0.5); // عالي جداً
|
||||||
|
} else if (count >= 3) {
|
||||||
|
color = Colors.orange.withOpacity(0.5); // متوسط
|
||||||
|
} else {
|
||||||
|
color = Colors.green.withOpacity(0.4); // منخفض
|
||||||
|
}
|
||||||
|
|
||||||
|
// إنشاء المربع
|
||||||
|
tempPolygons.add(Polygon(
|
||||||
|
polygonId: PolygonId("$lat-$lng"),
|
||||||
|
points: [
|
||||||
|
LatLng(lat - offset, lng - offset),
|
||||||
|
LatLng(lat + offset, lng - offset),
|
||||||
|
LatLng(lat + offset, lng + offset),
|
||||||
|
LatLng(lat - offset, lng + offset),
|
||||||
|
],
|
||||||
|
fillColor: color,
|
||||||
|
strokeColor: color.withOpacity(0.8),
|
||||||
|
strokeWidth: 1,
|
||||||
|
visible: true,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
heatmapPolygons = tempPolygons;
|
||||||
|
}
|
||||||
|
|
||||||
void goToWalletFromConnect() {
|
void goToWalletFromConnect() {
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.back();
|
Get.back();
|
||||||
|
|||||||
@@ -134,16 +134,32 @@ class _HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
_MapControlButton(
|
_MapControlButton(
|
||||||
|
iconColor: Colors.blue,
|
||||||
icon: Icons.satellite_alt,
|
icon: Icons.satellite_alt,
|
||||||
tooltip: 'Change Map Type'.tr,
|
tooltip: 'Change Map Type'.tr,
|
||||||
onPressed: homeCaptainController.changeMapType,
|
onPressed: homeCaptainController.changeMapType,
|
||||||
),
|
),
|
||||||
_MapControlButton(
|
_MapControlButton(
|
||||||
|
iconColor: Colors.blue,
|
||||||
icon: Icons.streetview_sharp,
|
icon: Icons.streetview_sharp,
|
||||||
tooltip: 'Toggle Traffic'.tr,
|
tooltip: 'Toggle Traffic'.tr,
|
||||||
onPressed: homeCaptainController.changeMapTraffic,
|
onPressed: homeCaptainController.changeMapTraffic,
|
||||||
),
|
),
|
||||||
|
GetBuilder<HomeCaptainController>(
|
||||||
|
builder: (controller) {
|
||||||
|
return _MapControlButton(
|
||||||
|
// تغيير الأيقونة واللون بناءً على الحالة
|
||||||
|
icon: Icons.local_fire_department,
|
||||||
|
iconColor: controller.isHeatmapVisible
|
||||||
|
? Colors.orange
|
||||||
|
: Colors.grey,
|
||||||
|
tooltip: 'Show Heatmap'.tr,
|
||||||
|
onPressed: controller.toggleHeatmap,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
_MapControlButton(
|
_MapControlButton(
|
||||||
|
iconColor: Colors.blue,
|
||||||
icon: Icons.my_location, // Changed for clarity
|
icon: Icons.my_location, // Changed for clarity
|
||||||
tooltip: 'Center on Me'.tr,
|
tooltip: 'Center on Me'.tr,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
@@ -225,12 +241,16 @@ class _MapView extends StatelessWidget {
|
|||||||
padding: const EdgeInsets.only(bottom: 110, top: 300),
|
padding: const EdgeInsets.only(bottom: 110, top: 300),
|
||||||
fortyFiveDegreeImageryEnabled: true,
|
fortyFiveDegreeImageryEnabled: true,
|
||||||
onMapCreated: controller.onMapCreated,
|
onMapCreated: controller.onMapCreated,
|
||||||
|
// onCameraMove: controller.onCameraMove,
|
||||||
minMaxZoomPreference: const MinMaxZoomPreference(6, 18),
|
minMaxZoomPreference: const MinMaxZoomPreference(6, 18),
|
||||||
initialCameraPosition: CameraPosition(
|
initialCameraPosition: CameraPosition(
|
||||||
target: locationController.myLocation,
|
target: locationController.myLocation,
|
||||||
zoom: 15,
|
zoom: 15,
|
||||||
),
|
),
|
||||||
// --- تم حذف onCameraMove الخاطئ ---
|
// --- تم حذف onCameraMove الخاطئ ---
|
||||||
|
// === إضافة الطبقة الحرارية هنا ===
|
||||||
|
polygons: controller.heatmapPolygons,
|
||||||
|
// =
|
||||||
markers: {
|
markers: {
|
||||||
Marker(
|
Marker(
|
||||||
markerId: MarkerId('MyLocation'.tr),
|
markerId: MarkerId('MyLocation'.tr),
|
||||||
@@ -538,6 +558,7 @@ class _MapControlButton extends StatelessWidget {
|
|||||||
required this.icon,
|
required this.icon,
|
||||||
required this.onPressed,
|
required this.onPressed,
|
||||||
required this.tooltip,
|
required this.tooltip,
|
||||||
|
required MaterialColor iconColor,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Reference in New Issue
Block a user