From 3412f1b753220a1d1e643f2811c871a5defd5d28 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sat, 4 Jul 2026 17:02:24 +0300 Subject: [PATCH] Update: 2026-07-04 17:02:24 --- docs/redis_state_plan.md | 46 +++++++++++++++++++ .../intaleq_driver/CarNavigationData.kt | 3 ++ .../example/intaleq_driver/MainActivity.kt | 1 + .../example/intaleq_driver/MapPresentation.kt | 24 ++++++++-- .../lib/controller/car_platform_bridge.dart | 2 + .../navigation/navigation_controller.dart | 1 + 6 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 docs/redis_state_plan.md diff --git a/docs/redis_state_plan.md b/docs/redis_state_plan.md new file mode 100644 index 00000000..d5934358 --- /dev/null +++ b/docs/redis_state_plan.md @@ -0,0 +1,46 @@ +# Redis State Cache Plan + +## New Redis Keys +- `ride:{id}:state` (Hash) → status, driver_id, passenger_id, carType, updated_at +- `ride:{id}:driver` (Hash) → driver_name, car_model, car_plate, rating, phone (cached) + +## Changes Per File + +### acceptRide.php +After MySQL lock succeeds: +```php +$redis->hmset("ride:$rideId:state", [ + 'status' => $status, + 'driver_id' => $driverId, + 'passenger_id'=> $passengerIdValue, + 'carType' => $carType, + 'updated_at' => time() +]); +$redis->expire("ride:$rideId:state", 86400); + +$redis->hmset("ride:$rideId:driver", $driverInfo); +$redis->expire("ride:$rideId:driver", 86400); + +$redis->publish("ride:state_changes", json_encode([ + 'ride_id' => $rideId, 'status' => 'accepted', + 'driver_id' => $driverId, 'passenger_id' => $passengerIdValue +])); +``` + +### start_ride.php +```php +$redis->hmset("ride:$rideId:state", ['status' => 'Begin', 'updated_at' => time()]); +$con_ride->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?")->execute([$status, $ride_id]); +$redis->publish("ride:state_changes", [...]); +``` + +### arrive_ride.php, cancel_ride_*.php +Same pattern: Redis update first (or after), then MySQL, then Pub/Sub. + +### finish_ride_updates.php +No change to Redis state (keep MySQL transaction as-is). + +## Socket Server Changes (loction_server/driver_socket.php) +- Subscribe to Redis `ride:state_changes` channel +- On message: update in-memory state, emit to passenger room +- Read from `ride:{id}:state` hash instead of MySQL queries diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/CarNavigationData.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/CarNavigationData.kt index f964ea00..6a7ad950 100644 --- a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/CarNavigationData.kt +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/CarNavigationData.kt @@ -25,6 +25,9 @@ object CarNavigationData { var isNavigating: Boolean = false var currentSpeed: Double = 0.0 // km/h + // --- إعدادات المظهر --- + var isMapDarkMode: Boolean = false // true = dark (style_dark.json), false = light (style.json) + // --- نظام المستمعين --- private val listeners = mutableListOf<() -> Unit>() diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MainActivity.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MainActivity.kt index d087500b..2ce553e0 100644 --- a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MainActivity.kt +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MainActivity.kt @@ -78,6 +78,7 @@ class MainActivity : FlutterFragmentActivity() { CarNavigationData.estimatedTimeRemainingSeconds = call.argument("eta") ?: CarNavigationData.estimatedTimeRemainingSeconds CarNavigationData.maneuverType = call.argument("maneuver") ?: CarNavigationData.maneuverType CarNavigationData.isNavigating = call.argument("isNavigating") ?: CarNavigationData.isNavigating + CarNavigationData.isMapDarkMode = call.argument("isMapDarkMode") ?: CarNavigationData.isMapDarkMode CarNavigationData.notifyListeners() result.success(true) } diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MapPresentation.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MapPresentation.kt index 116f9b55..7ab13dd1 100644 --- a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MapPresentation.kt +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MapPresentation.kt @@ -25,6 +25,21 @@ class MapPresentation(outerContext: Context, display: Display) : Presentation(ou private val locationListener: () -> Unit = { updateCameraPosition() + reloadStyleIfNeeded() + } + + private var currentStyleLoaded: String? = null + + private fun reloadStyleIfNeeded() { + val expectedStyle = if (CarNavigationData.isMapDarkMode) + "asset://packages/intaleq_maps/assets/style_dark.json" + else + "asset://packages/intaleq_maps/assets/style.json" + + if (currentStyleLoaded != expectedStyle && isMapReady) { + currentStyleLoaded = expectedStyle + mapboxMap?.setStyle(Style.Builder().fromUri(expectedStyle)) { isMapReady = true } + } } override fun onCreate(savedInstanceState: Bundle?) { @@ -51,9 +66,12 @@ class MapPresentation(outerContext: Context, display: Display) : Presentation(ou mapView.getMapAsync { map -> mapboxMap = map - // تحميل ستايل خرائط سيرو من أصول فلاتر - val styleUrl = "asset://flutter_assets/assets/style.json" - map.setStyle(Style.Builder().fromUri(styleUrl)) { + // تحميل ستايل خرائط سيرو من حزمة intaleq_maps حسب الوضعية + currentStyleLoaded = if (CarNavigationData.isMapDarkMode) + "asset://packages/intaleq_maps/assets/style_dark.json" + else + "asset://packages/intaleq_maps/assets/style.json" + map.setStyle(Style.Builder().fromUri(currentStyleLoaded)) { isMapReady = true updateCameraPosition() } diff --git a/siro_driver/lib/controller/car_platform_bridge.dart b/siro_driver/lib/controller/car_platform_bridge.dart index 328ce24d..e57cd82c 100644 --- a/siro_driver/lib/controller/car_platform_bridge.dart +++ b/siro_driver/lib/controller/car_platform_bridge.dart @@ -33,6 +33,7 @@ class CarPlatformBridge { required double eta, required int maneuver, required bool isNavigating, + bool isMapDarkMode = false, }) async { try { await _channel.invokeMethod('updateNavState', { @@ -46,6 +47,7 @@ class CarPlatformBridge { 'eta': eta, 'maneuver': maneuver, 'isNavigating': isNavigating, + 'isMapDarkMode': isMapDarkMode, }); } catch (_) {} } diff --git a/siro_driver/lib/controller/home/navigation/navigation_controller.dart b/siro_driver/lib/controller/home/navigation/navigation_controller.dart index d67ddae3..58280c85 100644 --- a/siro_driver/lib/controller/home/navigation/navigation_controller.dart +++ b/siro_driver/lib/controller/home/navigation/navigation_controller.dart @@ -1347,6 +1347,7 @@ class NavigationController extends GetxController ? currentManeuverModifier as int : int.tryParse(currentManeuverModifier.toString()) ?? 0, isNavigating: true, + isMapDarkMode: box.read('isMapDarkMode') ?? false, ); }